pillow Python
| Введение | |
| Создать | |
| Показать | |
| В другой формат | |
| Изменить размер | |
| Повернуть | |
| Заблюрить | |
| Обрезать | |
| Похожие статьи |
Введение
Библиотека обработки изображений Python добавляет возможности обработки изображений в ваш интерпретатор Python.
Эта библиотека обеспечивает расширенную поддержку форматов файлов, эффективное внутреннее представление и довольно мощные возможности обработки изображений.
Базовая библиотека обработки изображений предназначена для быстрого доступа к данным, хранящимся в нескольких основных пиксельных форматах. Она должна стать прочной основой для универсального инструмента обработки изображений.
Официальная документация
Установка
python -m pip install pillow
Collecting pillow Downloading pillow-12.0.0-cp312-cp312-win_amd64.whl.metadata (9.0 kB) Downloading pillow-12.0.0-cp312-cp312-win_amd64.whl (7.0 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.0/7.0 MB 3.0 MB/s eta 0:00:00 Installing collected packages: pillow Successfully installed pillow-12.0.0
Создать изображение
from PIL import Image size = (1000, 300) im_blank = Image.new("RGBA", size) im_blank.show() im_green = Image.new("RGBA", size, "green") im_green.show()
Ниже вы видите пустое изображение. Чтобы убедиться в том, что это изображение - можете кликнуть правой кнопкой мыши и нажать Открыть изображение в новой вкладке (Open Image In New Tab)
Показать изображение
Рассмотрим проект со следующей структурой: скрипт demo.py и несколько фотографий с сайта HeiHei.ru
pillow ├── demo.py ├── fuengirola.jpg ├── malaga.jpg ├── riga.jpg └── torremolinos.jpg
from PIL import Image im = Image.open("fuengirola.jpg") im.show()
www.heihei.ru
Альтернативный способ открыть изображение - воспользоваться менеджером контекста
from PIL import Image with Image.open("malaga.jpg") as im: im.show()
www.heihei.ru
Получить данные об изображении
… print(im.format, im.size, im.mode) print(im.format_description)
JPEG (1000, 500) RGB JPEG (ISO 10918)
Сохранить в другом формате
Сохраним фотографию Фуэнхиролы как png файл.
from PIL import Image im = Image.open("fuengirola.jpg") im.save("fuengirola.png")
pillow ├── demo.py ├── fuengirola.jpg ├── fuengirola.png ├── malaga.jpg ├── riga.jpg └── torremolinos.jpg
Сохраним все файлы с расширением jpg как png
Сперва применим способ с официального сайта pillow
# demo.py import os, sys from PIL import Image for infile in sys.argv[1:]: f, e = os.path.splitext(infile) outfile = f + ".png" if infile != outfile: try: with Image.open(infile) as im: im.save(outfile) except OSError: print("cannot convert", infile)
python demo.py fuengirola.jpg malaga.jpg riga.jpg torremolinos.jpg
pillow ├── demo.py ├── fuengirola.jpg ├── fuengirola.png ├── malaga.jpg ├── malaga.png ├── riga.jpg ├── riga.png ├── torremolinos.jpg └── torremolinos.png
Здесь приходится перечислять все файлы вручную. Предлагаю рассмотреть способ, в котором будут преобразованы все файлы в директории. Файлы с .png расширением из текущей директории удалим.
Для этого нам пригодится метод listdir() из библиотеки os
import os from PIL import Image if not os.path.exists("pngs"): os.makedirs("pngs") for f in os.listdir("."): if f.endswith(".jpg"): i = Image.open(f) fn, fext = os.path.splitext(f) i.save("pngs/{}.png".format(fn))
pillow ├── demo.py ├── fuengirola.jpg ├── malaga.jpg ├── pngs │ ├── fuengirola.png │ ├── malaga.png │ ├── riga.png │ └── torremolinos.png ├── riga.jpg └── torremolinos.jpg
Изменить размер изображений
Изменим размер изображений задав его явно.
from PIL import Image im = Image.open("malaga.jpg") im_resized = im.resize((500,300)) im_resized.show()
В таких задачах удобно использовать фактор сжатия и исходные размеры изображения
from PIL import Image im = Image.open("malaga.jpg") x, y = im.size scale_factor = 0.5 new_size = (int(x * scale_factor), int(y * scale_factor)) im_resized = im.resize(new_size) im_resized.show()
В следующем примере изменим размер всех jpg изображений в директории.
Для изменения размера используем метод thumbnail
import os from PIL import Image if not os.path.exists("300"): os.makedirs("300") size_300 = (300, 300) for f in os.listdir("."): if f.endswith(".jpg"): im = Image.open(f) fn, fext = os.path.splitext(f) im.thumbnail(size_300) im.save("300/{}_300{}".format(fn, fext)) Image.open("300/fuengirola_300.jpg").show()
pillow ├── 300 │ ├── fuengirola_300.jpg │ ├── malaga_300.jpg │ ├── riga_300.jpg │ └── torremolinos_300.jpg ├── demo.py ├── fuengirola.jpg ├── malaga.jpg ├── riga.jpg └── torremolinos.jpg
Повернуть изображение
from PIL import Image im = Image.open("300/fuengirola_300.jpg") # Против часовой стрелки im.rotate(90).show()
from PIL import Image im = Image.open("malaga_300.jpg") im_rotated = im.rotate(60) im_rotated.show()
Часть изображения пропала, так как сохранился оригинальный размер фотографии.
Чтобы избежать потери данных нужно использовать expand
from PIL import Image im = Image.open("malaga_300.jpg") im_rotated = im.rotate(60, expand=True) im_rotated.show()
Чтобы изменить цвет, нужно воспользоваться fillcolor
… im_rotated = im.rotate(60, expand=True, fillcolor=(162,57,202))
Если требуется задавать цвета с помощью слов - пригодится ImageColor.getcolor
from PIL import Image, ImageColor im = Image.open("malaga_300.jpg") im_rotated = im.rotate(60, expand=True, fillcolor=ImageColor.getcolor("red", "RGB")) im_rotated.show()
Сделать изображение чёрно-белым
from PIL import Image im = Image.open("300/fuengirola_300.jpg") im.convert(mode="L").show()
Заблюрить изображение
Чтобы заблюрить изображение нужно использовать ImageFilter.
В следующем примере используем GaussianBlue. Значение по умолчанию 2.
from PIL import Image, ImageFilter im = Image.open("300/fuengirola_300.jpg") im.filter(ImageFilter.GaussianBlur()).show() im.filter(ImageFilter.GaussianBlur(2)).show() im.filter(ImageFilter.GaussianBlur(5)).show() im.filter(ImageFilter.GaussianBlur(10)).show()
Обрезать изображение
Чтобы обрезать изображение нужно использовать crop.
В следующем примере зададим левый X, верхний Y, правый X, нижний Y вручную
from PIL import Image im = Image.open("malaga_300.jpg") im_crop = im.crop((50, 10, 300, 150)) im_crop.show() im_crop.save("malaga_300_crop.jpg")
Часто бывает удобно отталкиваться от размера исходного изображения.
В следующем примере вырежем из правого нижнего угла водяной знак с логотипом
HeiHei.ru
Обратите внимание на то, что в crop мы передаём
кортеж
для наглядности выделил фиолетовыми скобками.
from PIL import Image im = Image.open("malaga.jpg") x, y = im.size from_right = x - 160 from_bottom = y - 160 im_crop = im.crop((from_right, from_bottom, x, y)) im_crop.show()
Отзеркалить изображение
Для горизонтального или вертикального отражения картинки используется метод transpose
from PIL import Image im = Image.open("malaga_300.jpg") im_flip_horiz = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) im_flip_vert = im.transpose(Image.Transpose.FLIP_TOP_BOTTOM) im_transposed = im.transpose(Image.Transpose.TRANSPOSE) im_flip_horiz.show() im_flip_vert.show() im_transposed.show()
Автор статьи: Андрей Олегович
| OCR | |
| Python | |
| Установка OCR библиотек | |
| OpenCV | |
| pytesseract |