Как изменить цвет пикселя pil

I need to change pixel color of an image in python. Except for the pixel value (255, 0, 0) red I need to change every pixel color value into black (0, 0, 0). I tried the following code but it doesn't

I need to change pixel color of an image in python. Except for the pixel value (255, 0, 0) red I need to change every pixel color value into black (0, 0, 0). I tried the following code but it doesn’t helped.

from PIL import Image
im = Image.open('A:ex1.jpg')
for pixel in im.getdata():
    if pixel == (255,0,0):
        print "Red coloured pixel"
    else:
        pixel = [0, 0, 0]

rook's user avatar

rook

5,7104 gold badges38 silver badges51 bronze badges

asked Apr 7, 2016 at 6:42

Kuppo's user avatar

1

See this wikibook: https://en.wikibooks.org/wiki/Python_Imaging_Library/Editing_Pixels

Modifying that code to fit your problem:

pixels = img.load() # create the pixel map

for i in range(img.size[0]): # for every pixel:
    for j in range(img.size[1]):
        if pixels[i,j] != (255, 0, 0):
            # change to black if not red
            pixels[i,j] = (0, 0 ,0)

Community's user avatar

answered Apr 7, 2016 at 7:05

magni-'s user avatar

magni-magni-

1,87418 silver badges19 bronze badges

3

You could use img.putpixel:

im.putpixel((x, y), (255, 0, 0))

Lonami's user avatar

Lonami

5,1421 gold badge19 silver badges35 bronze badges

answered Jun 25, 2019 at 16:57

Anno's user avatar

AnnoAnno

6671 gold badge10 silver badges20 bronze badges

Here is the way I’d use PIL to do what you want:

from PIL import Image

imagePath = 'A:ex1.jpg'
newImagePath = 'A:ex2.jpg'
im = Image.open(imagePath)

def redOrBlack (im):
    newimdata = []
    redcolor = (255,0,0)
    blackcolor = (0,0,0)
    for color in im.getdata():
        if color == redcolor:
            newimdata.append( redcolor )
        else:
            newimdata.append( blackcolor )
    newim = Image.new(im.mode,im.size)
    newim.putdata(newimdata)
    return newim

redOrBlack(im).save(newImagePath)

answered Apr 7, 2016 at 7:25

loxaxs's user avatar

loxaxsloxaxs

2,06921 silver badges26 bronze badges

0

Taking the question to an extreme level, here’s how to randomly change the channels in PIL (neglecting any 0, which I consider as background)

rr, gg, bb = in_img.split()
rr = rr.point(lambda p: 0 if p==0 else np.random.randint(256) )
gg = gg.point(lambda p: 0 if p==0 else np.random.randint(256) )
bb = bb.point(lambda p: 0 if p==0 else np.random.randint(256) )
out_img = Image.merge("RGB", (rr, gg, bb))
out_img.getextrema()
out_img.show()

Enjoy!

answered Nov 11, 2018 at 12:50

innuendo's user avatar

innuendoinnuendo

3634 silver badges12 bronze badges

изменение цвета пикселя в изображении. Библиотека PIL Python

В прошлой статье мы узнали как установить библиотеку PIL в Python и начать уже с ней работать. В этой статье мы продолжаем изучение библиотеки PIL. Начиная с версией 1.1.6 метод load() возвращает объект, с помощью которого можно получить доступ к отдельным пикселям изображения. Указав два значения внутри квадратных скобок, можно получить или задать цвет пикселя.

>>> img = Image.open("foto.jpg")
>>> obj = img.load()
>>> obj[25, 45]                    # Получаем цвет пикселя
(122, 86, 62)
>>> obj[25, 45] = (255, 0, 0)      # Задаем цвет пикселя (красный)

Для доступа к отдельному пикселю вместо метода load() можно использовать методы getpixel() и putpixel(). Метод getpixel(<Координаты>) позволяет получить цвет указанного пикселя, а метод putpixel(<Координаты>, <Цвет>) изменяет цвет пикселя. Координаты пикселя указываются в виде кортежа из двух элементов. Необходимо заметить, что эти методы работают медленнее метода load(). Пример использования метода getpixel() и putpixel() приведен ниже.

Использование метода getpixel() и putpixel()

>>> img = Image.open("foto.jpg")
>>> img.getpixel((25, 45))              # Получаем цвет пикселя
(122, 86, 62)
>>> img.putpixel((25, 45), (255, 0, 0)) # Изменяем цвет пикселя
>>> img.getpixel((25, 45))              # Получаем цвет пикселя
(255, 0, 0)
>>> img.show()                          # Просматриваем изображение

В этом примере для просмотра изображения мы воспользовались методом show(). Метод show() создает временный файл в формате BMP и запускает программу для просмотра изображения, используемую в операционной системе по умолчанию. Например, на моем компьютере запускается программа ACDSee. Для сохранения изображения в файл предназначен метод save().

В первом параметре указывается абсолютный или относительный путь. Вместо пути можно передать файловый объект, открытый в бинарном режиме. Сохраним изображение в форматах JPEG и BMP разными способами.

Сохраняем изображение в Python

>>> img.save("tmp.jpg")          # В формате JPEG
>>> img.save("tmp.bmp", "BMP")   # В формате BMP
>>> f = open("tmp2.bmp", "wb")
>>> img.save(f, "BMP")           # Передаем файловый объект
>>> f.close()

Обратите внимание на то, что мы открыли файл в формате JPEG, а сохранили его в формате BMP. Таким образом, можно открывать изображения в одном формате и конвертировать его в другой формат. Если сохранить изображение не удалось, возбуждается исключение IOError. Если параметр <Формат> не указан, то формат изображения определяется по расширению файла.

В параметре <Обции> можно указать дополнительный характеристики изображения. Поддерживаемый опции зависят от формата изображения. Например, по умолчанию изображения в формате JPEG сохраняются с качеством 75. С помощью опции quality можно указать другое значение в диапазоне от 1 до 100.

>>> img.save("tmp3.jpg", "JPEG", quality=100) # Указание качества

За дополнительной информации по опциям обращайтесь к документации. Так же для более подробной инструкции игры в покер можете прочитать poker правила и повысить свои навыки в этой игре. Удивите своих знакомых во время игры в покер, продемонстрировав им свой профессионализм игры.

In this article, we will learn Colors on an Image using the Pillow module in Python. Let’s discuss some concepts:

  • A crucial class within the Python Imaging Library is that the Image class. It’s defined within the Image module and provides a PIL image on which manipulation operations are often administered. An instance of this class is often created in several ways: by loading images from a file, creating images from scratch, or as a result of processing other images. We’ll see all these in use.
  • Any image consists of pixels, each pixel represents a dot in an image. A pixel contains three values and every value ranges between 0 and 255, representing the quantity of red, green, and blue components. The combination of those forms an actual color of the pixel.
  • The ImageColor module contains color tables and converters from CSS3-style color specifiers to RGB tuples. This module is used by PIL.Image.Image.new() and the ImageDraw module, among others.

ImageColor module that contains various formats of representing colors. These formats are as follows:

  • String: Colors can also be represented as strings such as red, green, blue, yellow. They are case insensitive.
  • Hexadecimal Color: It is represented as: #rgb or #rrggbb. For example- #ffff00 represents yellow where red is 255, green is 255 and blue is 0. RGB would be a tuple-(255,255,0)
  • Cylindrical: It is represented as HSL where H-hue, S-saturation, and L-lightness of color. For example- #ffff00 represents yellow where hue is 0.63, saturation is 1.00 and also the lightness value is 0.50.

Creating Images with colors

Here, we will create Images with colors using Image.new() method.

PIL.Image.new() method creates a new image with the given mode and size. Size is given as a (width, height)-tuple, in pixels. The color is given as a single value for single-band images, and a tuple for multi-band images (with one value for each band). We can also use color names. If the color argument is omitted, the image is filled with zero (this usually corresponds to black). If the color is None, the image is not initialized. This can be useful if you’re going to paste or draw things in the image.

Syntax: PIL.Image.new(mode, size, color)

Parameters:

  • mode: The mode to use for the new image. (It could be RGB, RGBA)
  • size: A 2-tuple containing (width, height) in pixels.
  • color: What color to use for the image. Default is black. If given, this should be a single integer or floating point value for single-band modes, and a tuple for multi-band modes.

Return Value: An Image object.

Python3

from PIL import Image

img = Image.new('RGB',(200,200),(255,0,0))

img.show()

Output:

Converting color string to RGB Color values

Using the ImageColor module, we can also convert colors to RGB format(RGB tuple) as RGB is very convenient to perform different operations. To do this we will use ImageColor.getgrb() method. The ImageColor.getrgb() Convert a color string to an RGB tuple. If the string cannot be parsed, this function raises a ValueError exception.

Syntax: PIL.ImageColor.getrgb(color)

Parameters:

  • color: A color string

Returns: (red, green, blue[, alpha])

Python3

from PIL import ImageColor

img1 = ImageColor.getrgb("yellow")

print(img1)

img2 = ImageColor.getrgb("red")

print(img2)

Output:

(255, 255, 0)
(255, 0, 0)

Converting color string to Grayscale values

The ImageColor.getcolor() Same as getrgb(), but converts the RGB value to a grayscale value if the mode is not color or a palette image. If the string cannot be parsed, this function raises a ValueError exception.

Syntax: PIL.ImageColor.getcolor(color, mode)

Parameters:

  • color – A color string

Returns: (graylevel [, alpha]) or (red, green, blue[, alpha])

Python3

from PIL import ImageColor

img1 = ImageColor.getcolor("yellow",'L')

print(img1)

img2 = ImageColor.getcolor("red",'L')

print(img2)

Output:

226
76

Change the color by changing the pixel values

We can also change the color of an image to some other color.

Input Image:

Python3

from PIL import Image

img = Image.open("flower.jpg")

img = img.convert("RGB")

d = img.getdata()

new_image = []

for item in d:

    if item[0] in list(range(200, 256)):

        new_image.append((255, 224, 100))

    else:

        new_image.append(item)

img.putdata(new_image_data)

img.save("flower_image_altered.jpg")

Output:

In this article, we will learn Colors on an Image using the Pillow module in Python. Let’s discuss some concepts:

  • A crucial class within the Python Imaging Library is that the Image class. It’s defined within the Image module and provides a PIL image on which manipulation operations are often administered. An instance of this class is often created in several ways: by loading images from a file, creating images from scratch, or as a result of processing other images. We’ll see all these in use.
  • Any image consists of pixels, each pixel represents a dot in an image. A pixel contains three values and every value ranges between 0 and 255, representing the quantity of red, green, and blue components. The combination of those forms an actual color of the pixel.
  • The ImageColor module contains color tables and converters from CSS3-style color specifiers to RGB tuples. This module is used by PIL.Image.Image.new() and the ImageDraw module, among others.

ImageColor module that contains various formats of representing colors. These formats are as follows:

  • String: Colors can also be represented as strings such as red, green, blue, yellow. They are case insensitive.
  • Hexadecimal Color: It is represented as: #rgb or #rrggbb. For example- #ffff00 represents yellow where red is 255, green is 255 and blue is 0. RGB would be a tuple-(255,255,0)
  • Cylindrical: It is represented as HSL where H-hue, S-saturation, and L-lightness of color. For example- #ffff00 represents yellow where hue is 0.63, saturation is 1.00 and also the lightness value is 0.50.

Creating Images with colors

Here, we will create Images with colors using Image.new() method.

PIL.Image.new() method creates a new image with the given mode and size. Size is given as a (width, height)-tuple, in pixels. The color is given as a single value for single-band images, and a tuple for multi-band images (with one value for each band). We can also use color names. If the color argument is omitted, the image is filled with zero (this usually corresponds to black). If the color is None, the image is not initialized. This can be useful if you’re going to paste or draw things in the image.

Syntax: PIL.Image.new(mode, size, color)

Parameters:

  • mode: The mode to use for the new image. (It could be RGB, RGBA)
  • size: A 2-tuple containing (width, height) in pixels.
  • color: What color to use for the image. Default is black. If given, this should be a single integer or floating point value for single-band modes, and a tuple for multi-band modes.

Return Value: An Image object.

Python3

from PIL import Image

img = Image.new('RGB',(200,200),(255,0,0))

img.show()

Output:

Converting color string to RGB Color values

Using the ImageColor module, we can also convert colors to RGB format(RGB tuple) as RGB is very convenient to perform different operations. To do this we will use ImageColor.getgrb() method. The ImageColor.getrgb() Convert a color string to an RGB tuple. If the string cannot be parsed, this function raises a ValueError exception.

Syntax: PIL.ImageColor.getrgb(color)

Parameters:

  • color: A color string

Returns: (red, green, blue[, alpha])

Python3

from PIL import ImageColor

img1 = ImageColor.getrgb("yellow")

print(img1)

img2 = ImageColor.getrgb("red")

print(img2)

Output:

(255, 255, 0)
(255, 0, 0)

Converting color string to Grayscale values

The ImageColor.getcolor() Same as getrgb(), but converts the RGB value to a grayscale value if the mode is not color or a palette image. If the string cannot be parsed, this function raises a ValueError exception.

Syntax: PIL.ImageColor.getcolor(color, mode)

Parameters:

  • color – A color string

Returns: (graylevel [, alpha]) or (red, green, blue[, alpha])

Python3

from PIL import ImageColor

img1 = ImageColor.getcolor("yellow",'L')

print(img1)

img2 = ImageColor.getcolor("red",'L')

print(img2)

Output:

226
76

Change the color by changing the pixel values

We can also change the color of an image to some other color.

Input Image:

Python3

from PIL import Image

img = Image.open("flower.jpg")

img = img.convert("RGB")

d = img.getdata()

new_image = []

for item in d:

    if item[0] in list(range(200, 256)):

        new_image.append((255, 224, 100))

    else:

        new_image.append(item)

img.putdata(new_image_data)

img.save("flower_image_altered.jpg")

Output:

In this blog, we will be learning about changing the pixel values of an image in Python. For this purpose, we will have to use the Python Imaging Library (abbreviated as PIL). Now let’s see how it is going to work out for us.

Importing and installing PIL

You can add any image from your library or else you can simply use the following procedure to create a simple black image.

from PIL import Image

First import the Image package from PIL. If you get any error such as the absence of PIL (expected in Python 2.7 & above) then do the following in command prompt:

pip uninstall Pillow
pip uninstall PIL
pip install Pillow

In the next step, import it again and get started. Now we need to import a package called display from IPython so that we can display our images with ease.

from PIL import Image
from IPython.display import display

Creating or importing an image

Now, we create a black image for our purpose. Create a variable and store in that variable the pixel values and colour code and name as given below:

MyImg = Image.new( 'RGB', (250,250), "black")
#Imported_Img = Image.open('ImageName.jpg') 
#use the commented code to import from our own computer

Creating a pixel map

Our goal will be changing the pixel values so that we can make it a multi-coloured image. For that, we need to create a pixel map by creating another variable ‘pixels’ and we load the image into that variable.

pixels = MyImg.load()

We now have to change pixel values of every row and column of the image (if we consider it as a matrix of pixels).

for i in range(MyImg.size[0]):        #for each column
    for j in range(MyImg.size[1]):    #For each row
        pixels[i,j] = (i, j, 100)    #set the colour according to your wish

Displaying the image

Finally, we display the image that is created after the change in pixel values.

display(MyImg)

The complete code to change the pixel values of an Image in Python

from PIL import Image
from IPython.display import display

MyImg = Image.new( 'RGB', (250,250), "black") 
pixels = MyImg.load() # creates the pixel map
display(MyImg)        # displays the black image
for i in range(MyImg.size[0]):    
    for j in range(MyImg.size[1]):  
        pixels[i,j] = (i, j, 100)

display(MyImg)        # displays the changed colourful image

Also read: Plot a histogram for an Image in PIL in Python

Время прочтения
2 мин

Просмотры 67K

Чтобы дойти до сложных алгоритмов обработки, стоит проанализировать стандартные схемы, с чего я и предлагаю начать.

Для примеров обработки будет использоваться изображение с различным наборов цветов:

image

Для старта нам потребуется два модуля библиотеки:

from PIL import Image, ImageDraw 

Настроим инструменты для комфортной дальнейшей работы:

image = Image.open('test.jpg')  # Открываем изображение
draw = ImageDraw.Draw(image)  # Создаем инструмент для рисования
width = image.size[0]  # Определяем ширину
height = image.size[1]  # Определяем высоту
pix = image.load()  # Выгружаем значения пикселей

Приступим

Обрабатывать изображения будем в формате RGB. Также PIL поддерживает работу с форматами 1, L, P, RGB, RGBA, CMYK, YCbCr, LAB, HSV, I, F.

Значения пикселя в изображении задаются в формате: (x,y),(red, green, blue), где x,y — координаты, а числовые значения RGB находятся в диапазоне от 0 до 255. То есть работаем с 8-битным изображением.

Оттенок серого

Серый оттенок появляется в случае равенства всех палитр цветов, поэтому нам нужно получить среднее арифметическое значение во всех трёх пунктах:


for x in range(width):
    for y in range(height):
       r = pix[x, y][0] #узнаём значение красного цвета пикселя
       g = pix[x, y][1] #зелёного
       b = pix[x, y][2] #синего
       sr = (r + g + b) // 3 #среднее значение
       draw.point((x, y), (sr, sr, sr)) #рисуем пиксель

image.save("result.jpg", "JPEG") #не забываем сохранить изображение

image

Небольшой нюанс

Человеческий глаз разный спектр цветов воспринимает по-разному. Точной формулы вам никто не даст, так как восприятие цветов так или иначе у всех разное, но если вам интересно, подробнее можно прочитать тут и тут.

Инверсия

Инверсия получается путём вычета из 255 текущего цвета:


for x in range(width):
   for y in range(height):
      r = pix[x, y][0]
      g = pix[x, y][1]
      b = pix[x, y][2]
      draw.point((x, y), (255 - r, 255 - g, 255 - b))

image

Инверсия оттенка серого

Совмещая два предыдущих алгоритма можно написать следующий код:


for x in range(width):
    for y in range(height):
        r = pix[x, y][0]
        g = pix[x, y][1]
        b = pix[x, y][2]
        sr = (r + g + b) // 3
        draw.point((x, y), (255 - sr, 255 - sr, 255 - sr))

image

Выборочная инверсия оттенка серого

Для этого алгоритма нужно определить пороговое значение, которое я возьму за 100:

for x in range(width):
    for y in range(height):
        r = pix[x, y][0]
        g = pix[x, y][1]
        b = pix[x, y][2]
        if (r+g+b)>100: #если сумма значений больше 100 , то используем инверисю
            sr = (r + g + b) // 3
            draw.point((x, y), (255-sr, 255-sr, 255-sr))
        else: #иначе обычный оттенок серого
            sr = (r + g + b) // 3
            draw.point((x, y), (sr, sr, sr))

image

Заключение

В следующих статьях я хотел бы рассказать о том, как более локально подходить к фильтрации изображения, путём разделения его на области, а также показать интересные возможности DFS в алгоритмах обработки изображения

Объект Image представляет экземпляр открытого/созданного изображения. Для создания объектов Image используются соответствующие фабричные функции:

  • Функция PIL.Image.open() — открывает изображение;
  • Функция PIL.Image.new() — создает новое изображение;
  • Функция PIL.Image.frombytes() — создает новое изображение из массива байтов.

Атрибуты и методы объекта Image модуля Pillow.

  • Атрибуты объекта Image;
    • Image.filename имя исходного файла;
    • Image.format формат исходного файла;
    • Image.mode режим изображения;
    • Image.size размер изображения в пикселях;
    • Image.width ширина изображения;
    • Image.height высота изображения;
    • Image.palette цветовая палитра;
    • Image.info данные, связанные с изображением;
    • Image.is_animated изображение имеет более одного кадра;
    • Image.n_frames количество кадров;
  • Методы объекта Image;
    • Image.alpha_composite() накладывает изображение;
    • Image.apply_transparency() применяет прозрачность к палитре;
    • Image.convert() переводит пиксели через палитру;
    • Image.copy() копирует это изображение;
    • Image.crop() обрезает входное изображение;
    • Image.draft() загружает изображение с указанными параметрами;
    • Image.effect_spread() распределяет пиксели в изображении;
    • Image.entropy() возвращает энтропию для изображения;
    • Image.filter() применяет фильтр к изображению;
    • Image.frombytes() загружает в изображение пиксельные данные из bytes;
    • Image.getbands() возвращает название каждого канала;
    • Image.getbbox() возвращает рамку ненулевых областей изображения;
    • Image.getchannel() возвращает указанный канал изображения;
    • Image.getcolors() возвращает список цветов, используемых в изображении;
    • Image.getdata() возвращает содержимое изображения в последовательности;
    • Image.getexif() возвращает словарь EXIF тегов;
    • Image.getextrema() max и min значения пикселей для каждого канала;
    • Image.getpalette() возвращает палитру изображения;
    • Image.getpixel() значение цвета пикселя в заданной позиции;
    • Image.getprojection() возвращает последовательности с ненулевыми пикселями по оси X и Y ;
    • Image.histogram() возвращает список с количеством пикселей;
    • Image.paste() вставляет другое изображение;
    • Image.point() применяет пользовательскую функцию к каждому пикселю;
    • Image.putalpha() добавляет или заменяет альфа-канал;
    • Image.putdata() копирует пиксельные данные из сглаженной последовательности в изображение;
    • Image.putpalette() прикрепляет палитру к изображению;
    • Image.putpixel() изменяет значение пикселя в заданном положении;
    • Image.quantize() преобразует изображение в режим P с указанным количеством цветов;
    • Image.reduce() копия изображения, уменьшенная в несколько раз;
    • Image.remap_palette() измененным порядком палитры;
    • Image.resize() изменяет размер изображения;
    • Image.rotate() поворачивает изображение;
    • Image.save() cохраняет изображение;
    • Image.seek() поиск по номеру кадра;
    • Image.show() открывает изображение в программе просмотрщике;
    • Image.split() делит изображение на отдельные каналы;
    • Image.tell() возвращает номер текущего кадра;
    • Image.thumbnail() создает из изображения миниатюру;
    • Image.tobitmap() преобразовывает изображение в растровое изображения X11;
    • Image.tobytes() возвращает изображение как байтовый объект;
    • Image.transform() трансформирует изображение определенным методом;
    • Image.transpose() переворачивает или поворачивает изображения;
    • Image.verify() пытается определить, поврежден ли файл;
    • Image.load() выделяет память и загружает данные изображения;
    • Image.close() закрывает указатель файла изображения.

Атрибуты объекта Image.

Экземпляры класса Image имеют следующие атрибуты:

Image.filename:

Атрибут Image.filename это имя файла или путь к исходному файлу изображения.

Только изображения, созданные с помощью фабричной функции PIL.Image.open(), имеют атрибут Image.filename. Если входные данные представляют собой объект, подобный файлу, то атрибуту Image.filename присваивается значение пустой строки.

Image.format:

Атрибут Image.format представляет собой формат исходного файла. Для изображений, созданных самой библиотекой (с помощью PIL.Image.new() или путем изменения существующего изображения), этому атрибуту присвоено значение None.

Image.mode: str:

Атрибут Image.mode представляет собой режим изображения. Это строка, указывающая формат пикселей, используемый изображением. Типичные значения: 1, L, RGB или CMYK.

Image.size:

Атрибут Image.size представляет собой размер изображения в пикселях. Размер задается как кортеж (width, height).

Image.width:

Атрибут Image.width представляет собой ширину изображения, в пикселях.

Image.height:

Атрибут Image.height представляет собой высоту изображения, в пикселях.

Image.palette:

Атрибут Image.palette представляет собой таблицу цветовой палитры, если таковая имеется.

Если режим изображения установлен в P или PA, это должен быть экземпляр класса PIL.ImagePalette.ImagePalette. В противном случае для него должно быть установлено значение None.

Image.info:

Атрибут Image.info представляет собой словарь, содержащий данные, связанные с изображением. Этот словарь используется обработчиками файлов для передачи различной информации, не относящейся к изображениям, считанной из файла.

Например, атрибут Image.info может хранить сведения об ориентации изображения при его просмотре в программе-просмотрщике изображений. Например, тег может указывать, что изображение повернуто на 90 градусов или зеркально отражено.

Большинство методов игнорируют словарь при возврате новых/измененных изображений. Так как ключи не стандартизированы, методы не знают, повлияет ли проводимая ими операция на словарь. Если эта информация может понадобится позже, то необходимо сохранить ссылку на атрибут Image.info, возвращенный функцией PIL.Image.open().

from PIL import Image

with Image.open('test.jpg') as img:
    # сохраним словарь 
    info = img.info

Этот словарь не влияет на сохранение файлов, если не указано иное.

Image.is_animated:

Атрибут Image.is_animated возвращает True, если это изображение имеет более одного кадра, или False в противном случае.

Этот атрибут определяется только подключаемыми модулями изображений, которые поддерживают анимированные изображения.Плагины не поддерживающие загрузку анимированных изображений не определяют этот атрибут, даже если формат изображения поддерживает анимацию.

Принимая во внимание, что этот атрибут присутствует только у анимированных изображений, для проверки присутствия анимации в изображении независимо от его формата необходимо использовать функцию getattr(img, 'is_animated', False).

Дополнительно смотрите методы Image.n_frames, Image.seek() и Image.tell().

Image.n_frames:

Атрибут Image.n_frames возвращает количество кадров в анимированном изображении.

Этот атрибут определяется только подключаемыми модулями изображений, которые поддерживают анимированные изображения.Плагины не поддерживающие загрузку анимированных изображений не определяют этот атрибут, даже если формат изображения поддерживает анимацию.

Принимая во внимание, что этот атрибут присутствует только у анимированных изображений, для проверки присутствия анимации в изображении независимо от его формата необходимо использовать функцию getattr(img, 'n_frames', 1).

Дополнительно смотрите методы Image.is_animated, Image.seek() и Image.tell().

Методы объекта Image.

Экземпляр класса Image имеет следующие методы.

Если не указано иное, все методы возвращают новый экземпляр класса Image, содержащий результирующее/измененное изображение.

Image.alpha_composite(im, dest=(0, 0), source=(0, 0)):

Метод Image.alpha_composite() накладывает изображение im на изображение Image.

  • im: изображение для наложения.
  • dest: необязательный кортеж (left, top), определяющий левый верхний угол целевого изображения.
  • source: необязательный кортеж (left, top), определяющий левый верхний угол изображения наложения или кортеж (left, top, right, bottom) для границ исходного прямоугольника

Метод является аналогом функции |PIL.Image.alpha_composite()|.

Image.apply_transparency():

Метод Image.apply_transparency() применяет прозрачность к палитре, если изображение в режиме P имеет в словаре Image.info ключ transparency, после чего удаляет этот ключ из словаря. В противном случае изображение не меняется.

Image.convert(mode=None, matrix=None, dither=None, palette=Palette.WEB, colors=256):

Метод Imag.convert() возвращает преобразованную копию этого изображения. Для режима mode='P' этот метод переводит пиксели через палитру. Если mode опущен, то выбирается режим, при котором вся информация в изображении и палитре может быть представлена без палитры.

Метод Imag.convert() поддерживает все возможные преобразования между L, RGB и CMYK. Аргумент matix поддерживает только L и RGB.

При переводе цветного изображения в оттенки серого (режим L) библиотека использует преобразование яркости ITU-R 601-2:

L = R * 299/1000 + G * 587/1000 + B * 114/1000

Преобразование изображения в оттенках серого (L) или RGB по умолчанию в двухуровневое изображение (режим 1), метод Imag.convert() использует сглаживание Флойда-Стейнберга для приближения уровней яркости исходного изображения. Если значение dither равно None, то все значения, превышающие 127, устанавливаются равными 255 (белый), все остальные значения равны 0 (черный). Для установки других пороговых значений, необходимо использовать метод Image.point().

При преобразовании из RGBA в P без аргумента matix, метод передает операцию Image.quantize(), а дизеринг и палитра игнорируются.

При преобразовании из PA, если присутствует палитра RGBA, вместо значений из палитры будет использоваться альфа-канал из изображения.

  • mode: Запрошенный режим. Смотрите «Модель и режим изображений».
  • matrix: Необязательная матрица преобразования. Если указано, это должно быть 4 или 12 кортежей, содержащих значения с плавающей запятой.
  • dither: Метод сглаживания, используемый при преобразовании из режима RGB в P или из RGB или L в 1. Доступными методами являются: Dither.NONE или Dither.FLOYDSTEINBERG (по умолчанию) Обратите внимание, что метод сглаживания не используется, когда указана матрица преобразования.
  • palette: Палитра для использования при преобразовании из режима RGB в P. Доступные палитры: Palette.WEB или Palette.ADAPTIVE.
  • colors: Количество цветов для палитры Palette.ADAPTIVE. По умолчанию 256.

В следующем примере изображение RGB (линейно откалиброванное в соответствии с ITU-R 709 с использованием источника света D65) преобразуется в цветовое пространство CIE XYZ:

rgb2xyz = (0.412453, 0.357580, 0.180423, 0,
    0.212671, 0.715160, 0.072169, 0,
    0.019334, 0.119193, 0.950227, 0)

out = im.convert("RGB", rgb2xyz)

Image.copy():

Метод Image.copy() копирует это изображение. Метод используется для сохранения оригинального изображения при его последующем изменении.

Image.crop(box=None):

Метод Image.crop() возвращает прямоугольную область из изображения.

Аргумент box представляет собой кортеж (left, upper, right, lower), left и upper — это координаты в пикселях левого верхнего угла вырезаемой области, а right и lower нижний левый угол прямоугольной области. Смотрите «Система координат».

Следующий код обрезает входное изображение по переданным координатам:

from PIL import Image, ImageGrab
import time

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

with Image.open("test.jpg") as img:
    # задаем координаты вырезаемой области.
    (left, upper, right, lower) = (20, 20, 500, 500)
    # здесь изображение `img` обрезается и 
    # присваивается новой переменной `img_crop`.
    img_crop = img.crop((left, upper, right, lower))
    # сохраним вырезанную область.
    img_crop.save("test_crop.jpg")

Image.draft(mode, size):

Метод Image.draft() настраивает загрузчик файла изображения таким образом, чтобы он возвращал версию изображения, максимально соответствующую заданному режиму mode и размеру size.

Метод Image.draft() можно использовать для преобразования цветного JPEG изображения в оттенки серого при его загрузке.

При внесении каких-либо изменений возвращает кортеж с выбранным режимом mode и блок с координатами исходного изображения.

Обратите внимание

, что этот метод изменяет объект изображения на месте. Если изображение уже загружено, то метод не работает.

Примечание

. Этот метод реализован только для изображений JPEG и MPO.

  • mode: Запрошенный режим.
  • size: Запрошенный размер в пикселях (width, height).

Image.effect_spread(distance):

Метод Image.effect_spread() случайно распределяет пиксели в изображении. Аргумент distance определяет расстояние в котором распределяются пиксели.

from PIL import ImageGrab
import time

# 2 секунды на выбор окна
time.sleep(2)
# скриншот выбранного окна
img = ImageGrab.grab()
# применение метода к копии скриншота 
# и сохранение полученной картинки
img.effect_spread(5).save('effect_spread_5.png')
img.effect_spread(10).save('effect_spread_10.png')
img.effect_spread(20).save('effect_spread_20.png')
img.save('screenshot.png')

Image.entropy(mask=None, extrema=None):

Метод Image.entropy() вычисляет и возвращает энтропию для изображения.

С помощью этого метода двухуровневое изображение (режим 1) обрабатывается как изображение в оттенках серого (L).

  • mask: необязательная маска.
  • extrema: необязательный набор экстремумов, заданных вручную.

Если предоставлена маска mask, то метод использует гистограмму для тех частей изображения, где изображение маски не равно нулю. Изображение маски должно иметь тот же размер, что и изображение, и быть либо двухуровневым изображением (режим 1), либо изображением в градациях серого (L).

Image.filter(filter):

Метод Image.filter() изменяет это изображение, используя заданный фильтр. Список доступных фильтров смотрите в модуле ImageFilter.

Пример, где входное изображение размывается с помощью фильтра из модуля ImageFilter:

from PIL import Image, ImageFilter, ImageGrab
import time

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

with Image.open("test.jpg") as img:
    # Размытие входного изображения с 
    # помощью фильтра ImageFilter.BLUR
    img_blurred = img.filter(filter=ImageFilter.BLUR)
    img_blurred.save('img_blurred.jpg')
    # смотрим что получилось
    img_blurred.save("test_blurred.jpg")

Image.frombytes(data, decoder_name='raw', *args):

Метод Image.frombytes() загружает в исходное изображение пиксельные данные из объекта bytes.

Этот метод похож на функцию PIL.Image.frombytes(), но загружает данные в это изображение вместо создания нового объекта изображения.

Image.getbands():

Метод Image.getbands() возвращает кортеж, содержащий название каждого канала этого изображении. Например, для изображения RGB возвращает ('R', 'G', 'B').

Код ниже получает полосы входного изображения:

from PIL import Image

with Image.open("test.jpg") as img:
    print(img.getbands())  

# ('R', 'G', 'B')

Image.getbbox():

Метод Image.getbbox() вычисляет и возвращает ограничивающую рамку ненулевых областей изображения.

Ограничивающая рамка возвращается как четырехзначный кортеж, определяющий левую, верхнюю, правую и нижнюю координаты пикселя.

Если изображение полностью пусто, этот метод возвращает None.

Код ниже получает координаты ограничивающей рамки входного изображения:

from PIL import Image, ImageDraw, ImageFont

# создадим изображение с надписью
img = Image.new('RGB', (1000, 500))
draw = ImageDraw.Draw(img)
text = 'docs-python.ru'
ttf = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
font = ImageFont.truetype(ttf, size=100)
# накладываем текст
draw.text((100, 250), text, font=font, fill='#ffffff')
# сохраним полученное ипзображение для сравнения
img.save('img.png')
# вычислим рамку, ограничивающую надпись
box = img.getbbox()
# напечатаем координаты рамки
print(box)
# вырежем надпись
img_crop = img.crop(box)
# смотрим что получилось
img_crop.save('img_crop.png')

Image.getchannel(channel):

Метод Image.getchannel() возвращает изображение в режиме L, содержащее один канал исходного изображения.

Аргумент channel это имя или индекс канала, который необходимо вернуть. Может быть индексом (0 для канала R изображения RGB) или именем канала (A для альфа-канала изображения RGBA).

Image.getcolors(maxcolors=256):

Метод Image.getcolors() возвращает список цветов, используемых в этом изображении в виде несортированных значений (count_pixel, (r,g,b)).

Например, изображение RGB вернет набор цветовых значений (r,g,b), а изображение P вернет индекс цвета в палитре.

Аргумент maxcolors — максимальное количество цветов. Если это число превышено, метод возвращает None. Ограничение по умолчанию — 256 цветов.

from PIL import Image, ImageDraw, ImageFont

# создадим изображение
text = 'docs-python.ru'
text_size = 50
img_width = len(text) * 25
img_height = text_size * 2 
img = Image.new('RGB', (img_width, img_height))
draw = ImageDraw.Draw(img)
text = 'docs-python.ru'
ttf = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
font = ImageFont.truetype(ttf, size=text_size)
draw.text((10, text_size/2), text, font=font, fill='#ffffff')
# сохраним полученное изображение для сравнения
img.save(f'{text}.png')
# список цветов, используемых в изображении `img`
colors = img.getcolors()
# сортируем
colors = sorted(colors, key=lambda x: x[0], reverse=True)
# выводим 2 наиболее часто изпользуемых цвета в изображении
print(colors[:2])
# [(30803, (0, 0, 0)), (2505, (255, 255, 255))]

Image.getdata(band=None):

Метод Image.getdata() возвращает содержимое этого изображения в виде объекта последовательности, которое содержит значения пикселей. Объект последовательности выравнивается, так что значения для первой строки следуют сразу после значений нулевой строки и т. д.

Обратите внимание

, что объект последовательности, возвращаемый этим методом, является внутренним типом данных библиотеки Pillow, который поддерживает только определенные операции с последовательностями. Чтобы преобразовать его в обычную последовательность (например, для печати), используйте list(im.getdata()).

Аргумент band означает, какую группу вернуть. По умолчанию возвращаются все каналы. Чтобы вернуть один канал, нужно передать значение индекса (например, 0, чтобы получить R-канал из изображения RGB).

from PIL import Image, ImageDraw, ImageFont

# создадим изображение
text = 'docs-python.ru'
text_size = 50
img_width = len(text) * 25
img_height = text_size * 2 
img = Image.new('RGB', (img_width, img_height))
draw = ImageDraw.Draw(img)
text = 'docs-python.ru'
ttf = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
font = ImageFont.truetype(ttf, size=text_size)
draw.text((10, text_size/2), text, font=font, fill='#ffffff')
# получим содержимое изображения 
# в виде объекта последовательности
data = img.getdata()
print(list(data))

Image.getexif()
Image._getexif()
:

Метод Image.getexif() возвращает словарь основных, доподлинно известных EXIF тегов этого изображения.

Метод Image._getexif() возвращает словарь всех EXIF тегов этого изображения.

Код ниже расшифровывает ключи в словаре EXIF тегами изображения:

from PIL import Image, ExifTags

tags = ExifTags.TAGS
with Image.open('test.jpg') as img:
    # получаем значение exif тегов
    exif = img._getexif()
    for key, val in exif.items():
        print(tags.get(key, key), ':', val)

Примечание: подмодуль PIL.ExifTags предоставляет несколько классов enum.IntEnum, которые предоставляют константы и имена в открытом виде для различных известных тегов EXIF.

Image.getextrema():

Метод Image.getextrema() получает минимальное и максимальное значения пикселей для каждого канала изображения.

  • Для одноканального изображения возвращается кортеж из двух элементов, содержащий минимальное и максимальное значение пикселя.
  • Для многоканального изображения возвращается кортеж, содержащий по одному кортежу из двух элементов для каждого канала.

Image.getpalette(rawmode='RGB'):

Метод Image.getpalette() возвращает палитру изображения в виде списка цветовых значений [r, g, b, ...] или None, если изображение не имеет палитры.

Аргумент rawmode — режим, в котором нужно вернуть палитру. Значение None вернет палитру в ее текущем режиме.

Image.getpixel(xy):

Метод Image.getpixel() возвращает значение цвета пикселя в заданной позиции xy. Если изображение является многоканальным, этот метод возвращает кортеж.

Аргумент xy это координата в виде кортежа (x, y).

from PIL import Image, ImageDraw, ImageFont

# создадим изображение
text = 'docs-python.ru'
text_size = 50
img_width = len(text) * 25
img_height = text_size * 2 
img = Image.new('RGB', (img_width, img_height))
draw = ImageDraw.Draw(img)
text = 'docs-python.ru'
ttf = "/usr/share/fonts/truetype/freefont/FreeSans.ttf"
font = ImageFont.truetype(ttf, size=text_size)
draw.text((10, text_size/2), text, font=font, fill='#ffffff')
# получим цвет пикселя 
# в позиции (12,50)
print(img.getpixel((12,50)))
# (255, 255, 255) - белый
print(img.getpixel((11,50)))
# (106, 106, 106) - серый
print(img.getpixel((10,50)))
# (0, 0, 0) - черный

Image.getprojection():

Метод Image.getprojection() получает проекцию на оси x и y. Возвращает две последовательности, указывающие, где находятся ненулевые пиксели по оси X и оси Y соответственно.

Image.histogram(mask=None, extrema=None):

Метод Image.histogram() возвращает гистограмму изображения (список, содержащий количество пикселей).

Гистограмма возвращается в виде списка количества пикселей, по одному для каждого значения пикселя в исходном изображении. Счетчики сгруппированы в 256 бинов для каждого канала, даже если изображение имеет более 8 бит на канал. Если изображение содержит более одного канала, то гистограммы для всех каналов объединяются (например, гистограмма для изображения RGB содержит 768 значений).

  • Аргумент mask: Необязательная маска.
  • Аргумент extrema: Необязательный кортеж экстремумов, заданных вручную.

С помощью этого метода двухуровневое изображение (режим 1) обрабатывается как изображение в оттенках серого (L).

Если маска равна не None, то метод возвращает гистограмму для тех частей изображения, где изображение маски не равно нулю. Маска должна иметь тот же размер, что и изображение, и быть либо двухуровневым изображением (1), либо изображением в градациях серого (L).

Image.paste(im, box=None, mask=None):

Метод Image.paste() вставляет другое изображение im в это изображение.

Аргумент box представляет собой либо 2-кортеж, задающий верхний левый угол, либо 4-кортеж, определяющий левую, верхнюю, правую и нижнюю пиксельные координаты, либо None (то же, что (0, 0)). Если дается 4-кортеж, то размер вставляемого изображения должен соответствовать размеру региона.

Если режимы изображений не совпадают, то вставленное изображение преобразуется в режим этого изображения (подробности в методе Image.convert()).

Вместо изображения, источником может быть целое число или кортеж, содержащий значения пикселей. Затем метод заполняет область заданным цветом. При создании изображений в режиме RGB можно использовать цветовые хеш строки, например, #ffffff — белый цвет.

Если задана маска mask, то этот метод обновляет только области, указанные маской. Можно использовать изображения в режимах 1, L, LA, RGBA или RGBa (если присутствует, альфа-диапазон используется в качестве маски). Если маска равна 255, то данное изображение копируется как есть. Если маска равна 0, то текущее значение сохраняется. Промежуточные значения будут смешивать два изображения вместе, включая их альфа-каналы, если они есть.

Если нужно объединить изображения относительно их альфа-каналов, то дополнительно смотрите метод Image.alpha_composite().

Image.point(lut, mode=None):

Метод Image.point() сопоставляет это изображение с помощью таблицы поиска или функции lut.

Аргумент lut — таблица поиска, содержащая 256 (или 65536, если self.mode == 'I' и mode == 'L') значений для каждой полосы на изображении. Вместо таблицы можно использовать функцию, которая должна принимать один аргумент. Функция вызывается один раз для каждого возможного значения пикселя, и результирующая таблица применяется ко всем полосам изображения.

Это также может быть объект ImagePointHandler:

from PIL import Image

class Example(Image.ImagePointHandler):
  def point(self, data):
    # Возвращает результат

Аргумент mode – режим вывода (по умолчанию тот же, что и на входе). Аргумент можно использовать только в том случае, если исходное изображение имеет режим L или P, а выходной режим — 1, или режим исходного изображения — I, а выходной режим — L.

Пример преобразования картинки в «сканированное» изображение с порогом 120:

from PIL import ImageGrab
import time

# делаем задержку в 2 секунды, что бы 
# успеть переключиться на нужное окно 
time.sleep(2)
# делаем скриншот
img = ImageGrab.grab()
# т.е. применяем к каждому пикселю картинки функцию `fn`
threshold = 120
fn = lambda x : 255 if x > threshold else 0
# обесцвечивает картинку
img = img.convert('L')
# "сканируем" изображение
scan = img.point(fn)
# сохраняем
scan.save('scrshoot_scan.png')

Image.putalpha(alpha):

Метод Image.putalpha() добавляет или заменяет альфа-канал alpha в этом изображении. Если изображение не имеет альфа-канала, то оно преобразуется в LA или RGBA. Новый слой должен быть либо L, либо 1.

Аргумент alpha — может быть либо изображение L или 1, имеющее тот же размер, что и исходное изображение, либо целое число или другое значение цвета.

Image.putdata(data, scale=1.0, offset=0.0):

Метод Image.putdata() копирует пиксельные данные из объекта сглаженной последовательности data в изображение. Значения должны начинаться с верхнего левого угла (0, 0), продолжаться до конца строки, за которым непосредственно следует первое значение второй строки и так далее.

Данные будут считываться до тех пор, пока изображение или последовательность не закончатся. Значения scale и offset используются для настройки значений последовательности: pixel = value * scale + offset.

  • data: Сглаженный объект последовательности.
  • scale: Необязательное значение масштаба. Значение по умолчанию равно 1.0.
  • offset: Необязательное значение смещения. Значение по умолчанию равно 0.0.

Image.putpalette(data, rawmode='RGB'):

Метод Image.putpalette() прикрепляет палитру data к этому изображению. Исходное изображение должно быть в режиме P, PA, L или LA.

Последовательность палитры data должна содержать не более 256 цветов, состоящих из одного целочисленного значения для каждого канала в необработанном режиме. Например, если необработанный режим rawmode='RGB', то он может содержать не более 768 значений, состоящих из значений красного, зеленого и синего для соответствующего индекса пикселя в 256 цветах. Если необработанный режим RGBA, то он может содержать не более 1024 значений, содержащих значения красного, зеленого, синего и альфа-канала.

В качестве альтернативы вместо целочисленной последовательности можно использовать 8-битную строку.

  • Аргумент data — последовательность палитр (либо список, либо строка).
  • Аргумент rawmode это необработанный режим палитры. Либо RGB, RGBA, либо режим, который можно преобразовать в RGB или RGBA.

Image.putpixel(xy, value):

Метод Image.putpixel() изменяет значение пикселя на value в заданном положении xy. Цвет задается в виде одного числового значения для одноканальных изображений и кортежа для многоканальных изображений. В дополнение к этому, кортежи RGB и RGBA принимаются для изображений в режимах P и PA.

Обратите внимание

, что этот метод относительно медленный. Для более масштабных изменений необходимо использовать метод Image.paste() или модуль ImageDraw.

Image.quantize(colors=256, method=None, kmeans=0, palette=None, dither=Dither.FLOYDSTEINBERG):

Метод Image.quantize() преобразует изображение в режим P с указанным количеством цветов.

  • colors: Желаемое количество цветов, <= 256
  • palette: Квантовать в палитру заданных PIL.Image.Image.
  • dither: Метод сглаживания, используемый при преобразовании из режима RGB в P или из RGB или L в 1. Доступные методы: Dither.NONE или Dither.FLOYDSTEINBERG (по умолчанию).
  • method: Quantize.MEDIANCUT (срединный разрез), Quantize.MAXCOVERAGE (максимальный охват), Quantize.FASTOCTREE (быстрое октодерево), Quantize.LIBIMAGEQUANT (libimagequant; проверить поддержку с помощью PIL.features.check_feature() с аргументом feature="libimagequant"). По умолчанию будет использоваться Quantize.MEDIANCUT.

    Исключение составляют изображения RGBA. Quantize.MEDIANCUT и Quantize.MAXCOVERAGE не поддерживают изображения RGBA, вместо них по умолчанию используется Quantize.FASTOCTREE.

Image.reduce(factor, box=None):

Метод Image.reduce() возвращает копию изображения, уменьшенную в несколько раз. Если размер изображения не делится на коэффициент factor, то полученный размер будет округлен в большую сторону.

  • аргумент factor: Целое число больше 0 или кортеж из двух целых чисел для ширины и высоты отдельно.
  • аргумент box: Необязательный кортеж из 4 целых чисел, обеспечивающий уменьшение области исходного изображения. Значения должны быть в пределах прямоугольника (0, 0, ширина, высота). Если опущено или None, используется все изображение.

Image.remap_palette(dest_map, source_palette=None):

Метод Image.remap_palette() перезаписывает изображение, с измененным порядком палитры.

  • аргумент dest_map: Список индексов исходной палитры. Например [1,0] поменяет местами палитру из двух элементов, а list(range(256)) — это преобразование идентичности.
  • аргумент source_palette: Байты или None.

Image.resize(size, resample=None, box=None, reducing_gap=None):

Метод Image.resize() возвращает измененную копию этого изображения.

  • size: запрошенный размер в пикселях в виде кортежа: (width, height).
  • resample: дополнительный фильтр передискретизации. Это может быть Resampling.NEAREST, Resampling.BOX, Resampling.BILINEAR, Resampling.HAMMING, Resampling.BICUBIC или Resampling.LANCZOS. Если изображение имеет режим 1 или P, то для него всегда устанавливается Resampling.NEAREST. Если в режиме изображения указано количество битов, например I;16, то фильтром по умолчанию является Resampling.NEAREST. В противном случае фильтром по умолчанию является Resampling.BICUBIC. Смотрите «Встроенные фильтры передискретизации».
  • box: необязательный 4-х значный кортеж со значениями float, обеспечивающий масштабируемую область исходного изображения. Значения должны быть в пределах прямоугольника (0, 0, width, height). Если опущено или None, то используется весь источник.
  • reducing_gap: значение оптимизации, которая изменяет размер изображения в два шага. Во-первых, изображение уменьшается в целое число раз с помощью метода Image.reduce(). Во-вторых, размер изменяется с помощью обычной передискретизации. Передискретизация изменяет размер не меньше, чем reducing_gap. Значение reducing_gap может быть равно None (первый шаг не выполняется) или должно быть больше 1.0. Чем больше reducing_gap, тем ближе результат к справедливой повторной выборке. Чем меньше reducing_gap, тем быстрее изменяется размер. Если значение reducing_gap больше или равно 3.0, то результат в большинстве случаев неотличим от справедливой повторной выборки. Значение по умолчанию — None (оптимизация отсутствует).

Код ниже изменяет размер изображения с (width, height) на (width/2, height/2):

from PIL import Image, ImageGrab
import time

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

with Image.open("test.jpg") as img:
    # целевая ширина и высота изображения
    (width, height) = (img.width // 2, img.height // 2)
    img_resized = img.resize((width, height))
    # смотрим что получилось
    img_resized.save('img_resized.jpg')

Image.rotate(angle, resample=Resampling.NEAREST, expand=0, center=None, translate=None, fillcolor=None):

Метод Image.rotate() возвращает повернутую копию этого изображения.

Метод возвращает копию этого изображения, повернутую на заданное число градусов angle против часовой стрелки вокруг его центра center.

  • angle: угол поворота в градусах против часовой стрелки.
  • resample: дополнительный фильтр передискретизации. Это может быть Resampling.NEAREST, Resampling.BILINEAR или Resampling.BICUBIC. Если он опущен или если изображение имеет режим 1 или P, то для него устанавливается значение Resampling.NEAREST. Смотрите «Встроенные фильтры передискретизации».
  • expand: Необязательный флаг расширения. Если True, то выходное изображение расширяется, что делает его достаточно большим, чтобы вместить все повернутое изображение. Если значение False или опущено, то выходное изображение будет того же размера, что и входное. Обратите внимание, что флаг расширения предполагает вращение вокруг центра и отсутствие смещения translate.
  • center: Необязательный центр вращения (двойной кортеж). По умолчанию это центр изображения.
  • translate: Необязательный смещение после поворота (двойной кортеж).
  • fillcolor: Необязательный цвет для области за пределами повернутого изображения.

Код ниже поворачивает входное изображение на theta градусов против часовой стрелки:

from PIL import Image, ImageGrab
import time

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

with Image.open("test.jpg") as img:
    # сначала уменьшим скриншот
    (width, height) = (img.width // 2, img.height // 2)
    img_resized = img.resize((width, height))
    # угол поворота в градусах против часовой стрелки
    theta = 60
    img_rotated = img.rotate(angle=theta, expand=True)
    # смотрим что получилось
    img_rotated.save('img_rotated.jpg')

Image.save(fp, format=None, **params):

Метод Image.save() cохраняет изображение под заданным именем файла fp. Если формат format (JPEG, PNG, GIF, и т.д.) не указан, то используемый формат определяется по расширению имени файла, если это возможно.

Вместо имени файла можно использовать файловый объект. В этом случае необходимо всегда указывать формат format. Файловый объект должен реализовывать методы fp.seek, fp.tell и fp.write и открываться в двоичном режиме.

Возможные исключения:

  • ValueError: возникает, если формат вывода не удалось определить по имени файла. В этом случае необходимо передать аргумент format.
  • OSError: возникает, если файл не удалось записать. Возможно, файл был создан и может содержать частичные данные.

Image.seek(frame):

Метод Image.seek() выполняет поиск по номеру кадра frame в этом файле. Если номер кадра frame выходит за пределы конца последовательности кадров, то вызывается исключение EOFError. Когда файл с последовательностью кадров открыт, то Pillow автоматически ищет кадр 0.

Атрибут объекта изображения Image.n_frames указывает на количество доступных кадров.

Image.show(title=None):

Метод Image.show() открывает изображение в программе просмотрщике, заданной в OS по умолчанию. Внутри метод вызывает PIL.ImageShow.show(). Можно использовать PIL.ImageShow.register(), чтобы переопределить поведение по умолчанию.

Изображение сначала сохраняется во временный файл. По умолчанию он будет в формате PNG.

  • В Unix образ открывается с помощью утилиты display, eog или xv, в зависимости от того, какую из них можно найти.
  • В macOS изображение открывается с помощью собственного приложения Preview.
  • В Windows изображение открывается стандартной утилитой отображения PNG.

Аргумент title задает необязательный заголовок для использования в окне просмотрщика изображения, где это возможно.

Image.split():

Метод Image.split() делит изображение на отдельные каналы. Метод возвращает кортеж изображений отдельных полос исходного изображения.

Например, при разделении изображения RGB создаются три новых изображения, каждое из которых содержит копию одной из исходных полос (красной, зеленой, синей).

Если необходимо извлечь только один канал, то предпочтительнее использовать метод Image.getchannel(). Это будет более удобно и быстро.

Image.tell():

Метод Image.tell() возвращает номер текущего кадра.

Атрибут объекта изображения Image.n_frames указывает на количество доступных кадров. Номер кадров начинаются с 0.

Image.thumbnail(size, resample=Resampling.BICUBIC, reducing_gap=2.0):

Метод Image.thumbnail() создает из изображения миниатюру, изменяет объект изображения на месте и возвращает None.

Метод изменяет изображение так, чтобы оно содержало миниатюру самого себя, не превышающую заданный размер size. Он вычисляет подходящий размер эскиза с сохранением соотношения сторон, внутри вызывает метод Image.draft() для настройки программы чтения файлов (где применимо) и, наконец, изменяет размер изображения.

Обратите внимание

, что этот метод изменяет объект изображения на месте. Если также нужно использовать изображение с полным разрешением, то примените этот метод к копии исходного изображения, например: img.copy().thumbnail((250, 250)).

  • size: запрошенный размер в пикселях в виде кортежа: (width, height).
  • resample: дополнительный фильтр передискретизации. Это может быть Resampling.NEAREST, Resampling.BOX, Resampling.BILINEAR, Resampling.HAMMING, Resampling.BICUBIC или Resampling.LANCZOS. Если опущено, по умолчанию используется Resampling.BICUBIC. Смотрите «Встроенные фильтры передискретизации».
  • reducing_gap: значение оптимизации, которая изменяет размер изображения в два шага. Во-первых, изображение уменьшается в целое число раз с помощью метода Image.reduce() или Image.draft() для изображений JPEG. Во-вторых, размер изменяется с помощью обычной передискретизации. Передискретизация изменяет размер не меньше, чем reducing_gap. Значение reducing_gap может быть равно None (первый шаг не выполняется) или должно быть больше 1.0. Чем больше reducing_gap, тем ближе результат к справедливой повторной выборке. Чем меньше reducing_gap, тем быстрее изменяется размер. Если значение reducing_gap больше или равно 3.0, то результат в большинстве случаев неотличим от справедливой повторной выборки. Значение по умолчанию 2,0 (очень близко к справедливой передискретизации).

Пример создания миниатюр в формате JPEG:

import os, sys
from PIL import Image

size = (128, 128)
for infile in sys.argv[1:]:
    outfile = os.path.splitext(infile)[0] + ".thumbnail"
    if infile != outfile:
        try:
            with Image.open(infile) as im:
                im.thumbnail(size)
                im.save(outfile, "JPEG")
        except OSError:
            print("Не удается создать миниатюру для", infile)

Image.tobitmap(name='image'):

Метод Image.tobitmap() преобразовывает изображение в строку, содержащие растровое изображения X11.

Внимание! Этот метод работает только для изображений в режиме 1.

Аргумент name это префикс имени, используемый для переменных растрового изображения.

Если режим исходного изображения не равен 1, то возникает исключение ValueError

Image.tobytes(encoder_name='raw', *args):

Метод Image.tobytes() возвращает изображение как байтовый объект.

Предупреждение

: Метод возвращает необработанные данные изображения из внутренней памяти. Для сжатых данных изображения (например, PNG, JPEG) нужно использовать метод Image.save() с аргументом io.BytesIO для данных в памяти.

Например:

from PIL import Image, ImageGrab
import time, io

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

byteImgIO = io.BytesIO()
with Image.open("test.jpg") as img:
    # сохраняем в памяти как io.BytesIO()
    img.save(byteImgIO, "PNG")
    # указатель файла в начало
    byteImgIO.seek(0)
    # читаем байты изображения в переменную
    byteImg = byteImgIO.read()

# открываем изображение как байты
img = Image.open(io.BytesIO(byteImg))
# смотрим что получилось
img.save('img_frombytes.jpg')
  • Аргумент encoder_name — используемый кодировщик. По умолчанию используется стандартный 'raw' кодировщик (список доступных кодировщиков языка C можно увидеть в разделе codecs массива функций в _imaging.c).
  • Аргумент args — дополнительные аргументы для кодировщика.

Пример использования метода Image.tobytes() совместно с функцией PIL.Image.frombytes():

from PIL import Image, ImageGrab
import time

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

with Image.open("test.jpg") as img:
    size = img.size
    mode = img.mode
    # изображение в байтовый объект + меняем
    # местами каналы вместо 'RGB' => 'BGR'
    img_bytes = img.tobytes('raw', 'BGR')
    # + меняем местами красный и синий каналы
    # + перевернуть изображение
    # img_bytes = img.tobytes('raw', 'BGR', 0, -1)

# Создаем новое изображение с параметрами исходного 
img = Image.frombytes(mode, size, img_bytes, 'raw')
# Смотрим что получилось
img.save('img_frombytes.jpg')

Image.transform(size, method, data=None, resample=Resampling.NEAREST, fill=1, fillcolor=None):

Метод Image.transform() создает новое изображение заданного размера size и в том же режиме, что и исходное, и копирует данные в новое изображение с использованием заданного метода преобразования method.

  • size: Выходной размер в пикселях, как 2-кортеж: (width, height).
  • data: Дополнительные данные к методу преобразования method.
  • resample: дополнительный фильтр передискретизации. Это может быть Resampling.NEAREST, Resampling.BILINEAR или Resampling.BICUBIC. Если изображение имеет режим 1 или P, то для него всегда устанавливается Resampling.NEAREST. Смотрите «Встроенные фильтры передискретизации».
  • fill: Если метод является объектом ImageTransformHandler, то это один из передаваемых ему аргументов. В противном случае он не используется.
  • fillcolor: Необязательный цвет заливки для области за пределами преобразования на выходном изображении.
  • method: Метод преобразования.

    Может принимать:

    • Transform.EXTENT — вырезать прямоугольную подобласть,
    • Transform.AFFINE — аффинное преобразование,
    • Transform.PERSPECTIVE — перспективное преобразование,
    • Transform.QUAD — преобразование четырехугольника в прямоугольник,
    • Transform.MESH — преобразование количества исходных четырехугольников за одну операцию.

    Также может быть объект ImageTransformHandler:

    class Example(Image.ImageTransformHandler):
      def transform(self, size, data, resample, fill=1):
          # Возвращаем результат
    

    Также может быть объект с методом method.getdata, который возвращает кортеж, содержащий новый метод и значения данных:

    class Example:
      def getdata(self):
          method = Image.Transform.EXTENT
          data = (0, 0, 100, 100)
          return method, data
    

Image.transpose(method):

Метод Image.transpose() транспонирует изображение. Возвращает перевернутую или повернутую копию этого изображения.

Аргумент method: может принимать значения:

  • Transpose.FLIP_LEFT_RIGHT,
  • Transpose.FLIP_TOP_BOTTOM,
  • Transpose.ROTATE_90,
  • Transpose.ROTATE_180,
  • Transpose.ROTATE_270,
  • Transpose.TRANSPOSE,
  • Transpose.TRANSVERSE.

Код ниже переворачивает входное изображение с помощью метода Transpose.FLIP_LEFT_RIGHT.

from PIL import Image, ImageGrab
import time

# 2 секунды на выбор 
# окна для скриншота
time.sleep(2)
# создание скриншота выбранного окна
img = ImageGrab.grab()
# сохраним скриншот
img.save("test.jpg")

with Image.open("test.jpg") as img:
    # Отображает изображение слева направо
    img_flipped = img.transpose(method=Image.Transpose.FLIP_LEFT_RIGHT)
    img_flipped.save('img_flipped.png')

Image.verify():

Метод Image.verify() проверяет содержимое файла.

Для данных, считанных из файла, этот метод пытается определить, поврежден ли файл, без фактического декодирования данных изображения. Если этот метод обнаруживает какие-либо проблемы, то он вызывает соответствующие исключения.

Если нужно загрузить изображение после использования этого метода, то необходимо снова открыть файл.

Image.load():

Метод Image.load() выделяет память для изображения и загружает данные. В обычных случаях не нужно вызывать этот метод, так как класс Image автоматически загружает открытое изображение при первом доступе к нему.

Если файл, связанный с изображением, был открыт Pillow, то этот метод закроет его. Исключением является то, что изображение имеет несколько кадров, и в этом случае файл останется открытым для операций поиска.

Image.close():

Метод Image.close() закрывает указатель файла, если это возможно.

Эта операция уничтожит ядро ​​образа и освобождает его память. После этого данные изображения будут непригодны для использования.

Метод Image.close() необходим для закрытия изображений, которые имеют несколько кадров или файл которых не был прочитан и закрыт методом Image.load().

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить цвет пианино
  • Как изменить цвет печати принтера на цветной
  • Как изменить цвет печати принтера epson
  • Как изменить цвет пениса
  • Как изменить цвет пвх лодки

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии