Предисловие
Порой нужно выполнить рутинное действие, вроде добавления своего значка на картинку, или обрезки изображения. И, если для 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))
Который, в качестве аргумента, принимает размер изображения.

Уменьшаем изображение, сохраняя пропорции.
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-мя способами.

Первый.
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, данных знаний вам, вполне хватит что-бы автоматизировать выполнение простейших задач.
Итоговый результат.
