Python. Редактируем изображение с помощью Pillow.

Предисловие

Порой нужно выполнить рутинное действие, вроде добавления своего значка на картинку, или обрезки изображения. И, если для 2-3 изображений, это не составляет труда, то для 50-ти это превращается в пытку. К счастью, на Python легко автоматизировать любые задачи, включая обработку изображений.

Для работы понадобится библиотека Pillow, для установки введите в консоли.

pip install pillow

Открываем изображение.

Перепишите следующий код.

from PIL import Image
im = Image.open("cup.png")
im.show()

Разберем его.

from PIL import Image 

Из библиотеки PIL загружаем модуль Image

im = Image.open("cup.png")

Открываем файл картинки. В Image.open, нужно передать путь до картинки.

im.show()

Показываем её в программе по умолчанию.

Изображение открылось.

Заметьте, открытие изображения Image.open() крайне похоже на открытие файла open(). Что означает:

  • Изображение, также нужно закрывать im.close()
  • Его можно обернуть в блок with, тогда файл изображения закроется автоматически, при выходе из блока.

Для сохранения изображения, используйте.

im.save("название_изображения.png")

название_изображения замените на свое.

Открываем множество изображений.

Для работы потребуется библиотека glob.

pip install glob

Предположим, все изображения хранятся в папке images

Тогда, данный скрипт:

import glob
image_list = glob.glob("images/*")

Вернет, массив путей к изображениям image_list. Далее, обрабатываем картинки как угодно. Например, так:

for img_file in image_list:
    improve_image(img_file) 

где, improve_image — вымышленная функция, которая улучшает изображение.

Обрезаем изображение.

from PIL import Image
im = Image.open("cup.png")
region = im.crop((0,0,32,32))
region.show()

В данной строке

region = im.crop((0,0,32,32))

Я вырезал прямоуголник, в диапазоне от 0,0 (лево-верхний угол) до 32, 32 в пикселях.

По итогу, получили следующее.

Меняем размер изображения.

from PIL import Image
im = Image.open("cup.png")
im = im.resize((500,128))
im.show()

Менять размер будем методом resize

im = im.resize((500,128))

Который, в качестве аргумента, принимает размер изображения.

Растянул кружу, до 500 пикселей

Уменьшаем изображение, сохраняя пропорции.

from PIL import Image
im = Image.open("cup.png").convert("RGBA")
MAX_SIZE = (16, 16)
im.thumbnail(MAX_SIZE) 
im.show()

Метод thumbnail, уменьшает изображение до введенного размера, с сохранением пропорций, подробнее в документации.

Результат работы скрипта

Получилось мыло, связано это с тем, что используется сглаживаение. Отключим его.

im.thumbnail(MAX_SIZE, Image.NEAREST) 

Вставляем одно изображение, в другое.

Перепишите следующий код.

from PIL import Image
im = Image.open("cup.png").convert("RGBA")
im2 = Image.open("back.png").convert("RGBA")
im2.paste(im)

im2.show()

Сначала, откроем 2 изображения. Каждое изображение я конвертировал в формат RGBA.

im = Image.open("cup.png").convert("RGBA")
im2 = Image.open("back.png").convert("RGBA")

И вставил в изображение фона, изображение кружки.

im2.paste(im)

На выходе, получили следующее.

Также, можно указать координаты вставки изображения, добавив 2-ой аргумент.

im2.paste(im, (32,32)) #вставляем изображение на координатах 32x32 px

Увеличиваем контрастность

from PIL import Image, ImageEnhance
im = Image.open("cup.png").convert("RGBA")

enh = ImageEnhance.Contrast(im)
out = enh.enhance(1.8)
out.show()

Здесь потребуется модуль ImageEnhance

from PIL import Image, ImageEnhance

Выбираем контрастность

enh = ImageEnhance.Contrast(im)

И увеличиваем её на 80%.

out = enh.enhance(1.8)

И выводим на экран.

ImageEnchace, остальные функции.

Помимо этого, ImageEnhance может обезцветить изображение.

enh = ImageEnhance.Color(im)
out = enh.enhance(0.5)

Изменить уровень освещенности.

enh = ImageEnhance.Brightness(im) 
out = enh.enhance(0.5)

Поменять резкость.

enh = ImageEnhance.Sharpness(im)
out = enh.enhance(0.2)

Уменьшаем палитру изображения (квантование).

Урезать палтру можно 3-мя способами.

Изображение урезанное до 16-ти цветов.

Первый.

im = im.quantize(количество_цветов) 
  • количество_цветов — указывает максимальное количество цветов в изображении.

Количество цветов уменьшится, однако, размер палитры не изменится.

Второй.

im.convert('P', palette=Image.ADAPTIVE, colors=количество_цветов)

Ничем не отличается от предыдущего.

Третий.

Используйте скрипт урезания палитры из SGDK. Импорт палитры.

Данный способ самый лучший, т.к. уменьшает не только количество цветов, но и размер палитры. Плюс, позволяет менять dithering.

Отражаем по ветикали и горизонтали.

Изображение можно отразить по вертикали.

im = im.transpose(Image.FLIP_TOP_BOTTOM)

И, по горизонтали.

im = im.transpose(Image.FLIP_LEFT_RIGHT)

Поворачиваем изображение.

Для поворота изображения, используется rotate, который, в качестве аргумента, принимает угол поворота.

im = im.rotate(45)

Заключение.

В данной статье я рассказал об основах Pillow, данных знаний вам, вполне хватит что-бы автоматизировать выполнение простейших задач.

Итоговый результат.

Пожалуйста отключи блокировщик рекламы, или внеси сайт в белый список!

Please disable your adblocker or whitelist this site!