Одной из популярных библиотек для работы с изображениями является Pillow. Формально эта библиотека является форком другой библиотеки - PIL (Python Imaging Library). Однако если PIL работала со 2-й версий Python и давно уже не развивается, то Pillow имеет поддержку 3-й версии и продолжает развиваться.
Итак, установим данную библиотеку с помощью следующей команды:
pip install Pillow
(Стоит отметить, что в некоторые дистрибутивы Linux данная библиотека уже включена по умолчанию)
Для работы с библиотекой необходимо импортировать модуль Image:
from PIL import Image
Для открытия изображения вызывается функция open(), в которую передается путь к файлу:
from PIL import Image # открытие изображения img = Image.open("forest.jpg")
В данном случае предполагается, что изображение представляет файл "forest.jpg" и располагается в одной папке с текущим скриптом Python. После выполнения функции переменная img будет содержать информацию об изображении в виде объекта класса Image (класс Image располагается в подключенном модуле Image).
На случай, если будет передан некорректный путь, и программа сгенерирует ошибку, можно поместить вызов метода в конструкцию try/catch
:
from PIL import Image try: img = Image.open("C://somefolder//forest.jpg") except: print("Ошибка")
Класс Image предоставляет ряд атрибутов, которые хранят информацию об изображении:
filename: имя файла или путь к файлу в виде строки
format: формат файла. Если изображение создано самой библиотекой, то имеет значение None
.
mode: режим изображения, например, "1", "L", "RGB" или "CMYK". (Полный список форматов доступен в документации)
size: размер в виде кортежа (width, height)
width: ширина
height: высота
info: словарь dict, который хранит дополнительную ассоциированную с файлом информацию
is_animated: представляет булевое значение и равно True
, если изображение содержит более одного фрейма. Применяется к анимированным изображениям
n_frames: количество фреймов в изображении. Применяется к анимированным изображениям
Например, получим некоторую информацию об изображении:
from PIL import Image img = Image.open("forest.jpg") print(f"Width: {img.width}") print(f"Height: {img.height}") print(f"Filename: {img.filename}") print(f"Format: {img.format}") print(f"Mode: {img.mode}")
Консольный вывод в моем случае:
Width: 484 Height: 363 Filename: forest.jpg Format: JPEG Mode: RGB
С помощью метода show() можно октрыть изображение в программе для просмотра изображений по умолчанию для текщей операционной системы:
from PIL import Image img = Image.open("forest.jpg") img.show()
Для сохранения изображения применяется метод save(). В качестве обязательного параметра он принимает путь, по которому сохраняется изображение:
from PIL import Image img = Image.open("forest.jpg") # сохраняем в файл forest_new.jpg img.save("forest_new.jpg")
Для вращения изображения применяется метод rotate(), в который в качестве обязательного параметра передается угол поворота. Результатом метода является повернутое изображение:
from PIL import Image img = Image.open("forest.jpg") # поворот на 90 градусов img2 = img.rotate(90) # сохраняем новое изображение img2.save("forest_new.jpg")
Метод crop() позволяет вырезать часть изображения. В качестве параметра он принимает кортеж из 4 чисел, в формате:
(координата_X_верхнего_левого _угла, координата_Y_верхнего_левого _угла, координата_X_правого_нижнего _угла, координата_Y_правого_нижнего _угла)Результатом метода является новое изображение:
from PIL import Image img = Image.open("forest.jpg") img = img.crop((0, 0, img.width/2, img.height/2)) img.save("forest_new.jpg")
В данном случае происходит обрезка, начиная с левого верхнего угла до его половины ширины и высоты.
Для изменения размера изображения применяется метод resize(), в который в качестве параметра передается кортеж из двух чисел - новой высоты и ширины. Результатом метода является сгенерированное изображение. Например, уменьшим в два раза:
from PIL import Image img = Image.open("forest.jpg") # уменьшаем в два раза img = img.resize((img.width//2, img.height//2)) img.save("forest_new.jpg")
Если необходимо пропорциональное уменьшение размеров, то можно использовать метод reduce(), который в качестве обязательного параметра принимает множитель уменьшения. Например, уменьшим изображение в 2 раза:
from PIL import Image img = Image.open("forest.jpg") # уменьшаем в два раза img = img.reduce(2) img.save("forest_new.jpg")
Функция paste() позволяет наложить одно изображение на другое:
Image.paste(im, box=None, mask=None)
Первый параметр - im
представляет второе изображение, которое будет накладываться. Параметр box
определяет область наложения, а третий параметр - mask
Например:
from PIL import Image img = Image.open("forest.jpg") img2 = Image.open("cats.jpg") img.paste(img2) img.save("cats_in_forest.jpg")
В данном случае изображение "cats.jpg" накладывается на "forest.jpg". Поскольку область наложения не указана, то верхний левый угол "cats.jpg" проецируется на верхний левый угол "forest.jpg".
Параметр box
позволяет определить область наложения либо в виде кортежа с двумя элементами (координаты X и Y верхнего левого угла), либо в виде
кортежа с четырьмя элементами(координаты X и Y верхнего левого угла и правого нижнего угла):
from PIL import Image img = Image.open("forest.jpg") img2 = Image.open("cats_small.jpg") img.paste(img2, (img.width//2, img.height//2)) img.save("cats_in_forest.jpg")
Для зеркального отражения применяется метод transpose(). В качестве параметра он принимает принцип отзеркаливания в виде одного из следующих значений:
Image.Transpose.FLIP_LEFT_RIGHT
Image.Transpose.FLIP_TOP_BOTTOM
Image.Transpose.ROTATE_90
Image.Transpose.ROTATE_180
Image.Transpose.ROTATE_270
Image.Transpose.TRANSPOSE
Image.Transpose.TRANSVERSE
Например, применим значение Image.Transpose.FLIP_LEFT_RIGHT
, которое отражает слева направо:
from PIL import Image img = Image.open("cats.jpg") img = img.transpose(Image.Transpose.FLIP_LEFT_RIGHT) img.save("cats_new.jpg")
С помощью метода filter() к изображению можно применить фильтры. В качестве параметра метод принимает определение фильтра. По умолчанию библиотека предоставляет следующие фильтры, которые определены в модуле ImageFilter:
BLUR
CONTOUR
DETAIL
EDGE_ENHANCE
EDGE_ENHANCE_MORE
EMBOSS
FIND_EDGES
SHARPEN
SMOOTH
SMOOTH_MORE
Например, применение фильтра размытия Blur
from PIL import Image, ImageFilter img = Image.open("forest.jpg") img = img.filter(ImageFilter.BLUR) img.save("forest_new.jpg")
Для более детального ознакомления с остальным функционалом библиотеки можно обратиться к документации