Библиотека для работы с картинками Pillow имеет функцию crop(), которая дает возможность обрезать изображение, основываясь на имеющихся координатах. Сегодня мы поговорим о том, какие есть способы обрезки: как выполняется стандартная обрезка, обрезка картинки за пределами ее размеров, как оставить лишь центральную часть изображения, а также обрезать самый крупный квадрат из прямоугольника. Также мы узнаем, что делать для того, чтобы добавить прозрачный канал в изображение, поскольку это нужно уметь делать для того, чтобы качественно выполнять обрезку сложного фрагмента текста.
- Установка библиотеки PIL
- Как создать картинку с прозрачным фоном с помощью putalpha()
- Как использовать Image.putalpha()?
- Равномерная прозрачность по всей поверхности
- Создание прозрачного канала в рисунке
- Использование существующего изображения для задания прозрачного фона
- Простая обрезка изображения в Pillow
- Обрезка картинки за ее пределами
- Осуществление обрезки изображения по центру
- Как вырезать квадрат из прямоугольника?
- Заключение
Установка библиотеки PIL
Для начала нам надо установить саму библиотеку Pillow, если это не было сделано ранее. Для этого необходимо ввести следующую команду.
pip install --upgrade Pillow
Естественно, нужно иметь библиотеку PyPI, чтобы установить эту библиотеку. Убедитесь в том, что она есть у вас на компьютере. Если нет, установите.
Если будет желание, вы можете создать картинку с прозрачным фоном. Для этого нужно обрезать какую-либо другую форму, кроме прямоугольника. В качестве нее может быть, например, круг. Можно использовать putalpha().
Далее осуществляем импорт изображения из PIL и открываем картинку, которая нужна нам. Изображение, которое расположено ниже, можно сохранить на вашем компьютере под названием guido-van-rossum.jpg, а дальше начать с ней работать. Конечно, можно использовать и любое другое название. Просто в ином случае код, который будет использоваться ниже для демонстрации возможностей библиотеки Pillow для обрезки изображений, у вас не будет работать. Вы же можете использовать любое другое название.
from PIL import Image im = Image.open('guido-van-rossum.jpg') img.show()
Как создать картинку с прозрачным фоном с помощью putalpha()
Модуль Image библиотеки Pillow – это функциональный инструмент, который позволяет добавить альфа-канал к изображению, помимо многих других возможностей. Для этого необходимо воспользоваться модулем Image.putalpha(). Прозрачная маска позволяет добиваться самых интересных эффектов. Например, вырезать часть изображения в форме лошади. Как это сделать, поговорим немного позже.
Как использовать Image.putalpha()?
Параметр у этой функции только один – alpha. С его помощью и добавляется альфа-канал к оригинальному изображению. Выражается в целочисленных константах. Есть несколько режимов оригинальной картинки, от которых зависит наличие альфа-канала и действия этой функции с изображением:
- RGB. Это формат цветных изображений, где каждый цвет формируется из трех – красного, зеленого и синего. Они смешиваются в разных долях между собой. В этом случае происходит конвертация картинки из формата RGB в RGBA.
- RGBA. Это модификация RGB, где есть прозрачный канал.
- LA. Черно-белое изображение с альфа-каналом.
- L. Черно-белое изображение.
Если альфа-канала изображение не имеет, то он добавляется. Если он есть, обновляется.
Интенсивность альфа-канала является целочисленным значением, которое варьирует от 0 до 255. 0 – это полная прозрачность, а 255 – полное отсутствие прозрачности. Если вы устанавливаете объект типа «изображение» в таком же размере в черно-белом режиме, то можно назначить альфа-канал соответственно различным формам. Значения константы, выражающей интенсивность альфа-канала, здесь также будет варьировать в пределах от 0 до 255.
Равномерная прозрачность по всей поверхности
Если вы установите целочисленное значение на альфа, прозрачность в соответствии с с ним будет установлена на всей поверхности. Чем больше ее добавить, тем более мутной будет картинка на прозрачном фоне. Тем не менее, на непрозрачном в ней начнет просвечиваться фон. Таким образом можно добиваться очень интересных эффектов.
Обратите внимание, что putalpha () перезаписывает исходное изображение. Поэтому, если вы хотите сохранить исходное изображение как есть, используйте изображение, скопированное с помощью copy().
im_rgba = im_rgb.copy() im_rgba.putalpha(128) im_rgba.save('data/dst/pillow_putalpha_solid.png')
В результате, мы получим следующее изображение.
В этом примере используется интенсивность прозрачности 128. Это означает, что картинка будет полупрозрачной.
Создание прозрачного канала в рисунке
Если вы хотите добавить альфа-канал с простой формой, такой как круг или прямоугольник, для этого существует модуль ImageDraw. Поэтому его нужно импортировать в программу перед тем, как начать использовать.
Нарисуйте белый круг на черном фоне и присвойте ему альфа-канал.
im_a = Image.new("L", im_rgb.size, 0) draw = ImageDraw.Draw(im_a) draw.ellipse((140, 50, 260, 170), fill=255)
im_rgba = im_rgb.copy() im_rgba.putalpha(im_a) im_rgba_crop = im_rgba.crop((140, 50, 260, 170)) im_rgba_crop.save('data/dst/pillow_putalpha_circle.png')
Также можно использовать ImageFilter, чтобы смазать границы нашей маски.
im_a_blur = im_a.filter(ImageFilter.GaussianBlur(4))
im_rgba = im_rgb.copy() im_rgba.putalpha(im_a_blur) im_rgba_crop = im_rgba.crop((135, 45, 265, 175)) im_rgba_crop.save('data/dst/pillow_putalpha_circle_blur.png')
Использование существующего изображения для задания прозрачного фона
Также можно использовать ту картинку, которая есть, в качестве альфа-канала. Например, давайте попробуем использовать такую картинку для того, чтобы сделать прозрачный фон.
В этом примере, чтобы сделать так, чтобы картинка была в форме лошади, используем инвертированное изображение с белой лошадью и черным фоном. То есть, такое.
После того, как мы осуществим открытие изображения с помощью open(), картинка будет выровнена по размеру изображения с помощью resize(). А также мы используем convert(), чтобы конвертировать картинку в черно-белый формат.
im_a = Image.open('data/src/horse_r.png').convert('L').resize(im_rgb.size)
im_rgba = im_rgb.copy() im_rgba.putalpha(im_a) im_rgba.save('data/dst/pillow_putalpha_horse.png')
Симпатичный результат, не так ли?
Простая обрезка изображения в Pillow
Давайте обозначим область, в рамках которой будет осуществляться картинки, приведенной выше. Для реализации этой задачи необходимо использовать следующий кортеж box=(left, upper, right, lower).
После того, как вы его добавите, уже больше никаких изменений вносить не получится. Напоминаем, что кортеж – неизменяемый набор данных.
Соответствие левой верхней координате – (x, y) = (left, upper). Что касается правой верхней координаты, то соответствие ей будет следующим – (x, y) = (right, lower). Область, обрезка которой требуется, – это lett <= x <right и upper <= y <lower. Что касается пикселей x = right и y = lower, то они не включаются.
Учтите тот факт, что box вместе со скобками нужно использовать:
from PIL import Image im = Image.open('guido-van-rossum.jpg') im_crop = im.crop((100, 75, 300, 150)) im_crop.save('guido_pillow_crop.jpg', quality=95)
Если вам достаточно лишь сохранить обрезанное изображение без дополнительной обработки, то тогда достаточно использовать следующий код.
im.crop((100, 75, 300, 150)).save('guido_pillow_crop.jpg', quality=95)
Обрезка картинки за ее пределами
Если область, которая находится за пределами размеров картинки, попадает в область обрезки, то в этом случае ошибок не будет. Просто эта часть изображения будет окрашена в черный цвет.
from PIL import Image im = Image.open('guido-van-rossum.jpg') im_crop_outside = im.crop((100, 175, 300, 250)) im_crop_outside.save('guido_pillow_crop_outside.jpg', quality=95)
Осуществление обрезки изображения по центру
Если вам надо вырезать центр картинки определенного размера, то в этом случае необходимо использовать функцию crop_center.
from PIL import Image def crop_center(pil_img, crop_width: int, crop_height: int) -> Image: """ Функция для обрезки изображения по центру. """ img_width, img_height = pil_img.size return pil_img.crop(((img_width - crop_width) // 2, (img_height - crop_height) // 2, (img_width + crop_width) // 2, (img_height + crop_height) // 2)) im = Image.open('guido-van-rossum.jpg') im_new = crop_center(im, 200, 200) im_new.save('guido_crop_center.jpg', quality=95)
Как вырезать квадрат из прямоугольника?
Нередко нужно вырезать максимально возможный квадрат из прямоугольной картинки. В этом случае необходимо создать специальную функцию.
def crop_max_square(pil_img): return crop_center(pil_img, min(pil_img.size), min(pil_img.size))
А вот фрагмент кода, демонстрирующий особенности использования данной функции.
from PIL import Image def crop_center(pil_img, crop_width: int, crop_height: int) -> Image: """ Функция для обрезки изображения по центру. """ img_width, img_height = pil_img.size return pil_img.crop(((img_width - crop_width) // 2, (img_height - crop_height) // 2, (img_width + crop_width) // 2, (img_height + crop_height) // 2)) def crop_max_square(pil_img): return crop_center(pil_img, min(pil_img.size), min(pil_img.size)) im = Image.open('guido-van-rossum.jpg') im_new = crop_max_square(im) im_new.save('guido_crop_max_square.jpg', quality=95)
После того, как мы запустим этот код, получим на выходе файл guido_crop_max_square.jpg. Сама картинка будет такой.
Заключение
Мы разобрались в том, как обрезать часть изображения в Python. Как видим, для реализации этой задачи достаточно нескольких строк кода. Чтобы сделать это, используется одна из функций.