Модуль Image
из библиотеки для обработки изображений Pillow (PIL) предоставляет функцию crop()
для обрезки части изображения по указанным координатам.
Далее мы напишем код для решения следующих задач:
- Обычная обрезка картинки;
- Обрезка изображения за пределами её размеров;
- Обрезка центральной части картинки;
- Обрезка наиболее крупного квадрата из прямоугольника, миниатюра для записи на блоге.
Содержание статьи
- Простая обрезка изображения в Pillow
- Обрезка изображения за её пределами
- Обрезка изображения по центру в PIL
- Вырезаем квадрат из прямоугольника
Установка библиотеки PIL
1 |
pip install --upgrade Pillow |
При желании создать изображение с прозрачным фоном, обрезав какую-то другую форму, помимо прямоугольника (к примеру, круг), можно использовать putalpha()
.
Связанная статья: Создание изображения с прозрачным фоном
Импортируем Image
из PIL
и откроем нужное изображение. Вы можете сохранить ниже предоставленную картинку под названием guido-van-rossum.jpg и начать работу с ней.
1 2 3 4 |
from PIL import Image im = Image.open('guido-van-rossum.jpg') img.show() |
Простая обрезка изображения в Pillow
Обозначим область обрезки изображения с помощью кортежа box=(left, upper, right, lower)
.
Верхней левой координате соответствует (x, y) = (left, upper)
, а нижней правой — (x, y) = (right, lower)
. Область, которую нужно обрезать — left <= x <right
и upper <= y <lower
, а пиксели x = right
и y = lower
не включаются.
Не забудьте, что box
используется вместе со скобками ()
.
1 2 3 4 5 6 |
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) |
Если вы просто хотите сохранить обрезанную картинку без другой обработки, можете использовать следующий код:
1 |
im.crop((100, 75, 300, 150)).save('guido_pillow_crop.jpg', quality=95) |
Обрезка изображения за её пределами
Если область за пределами размеров картинки включается в область обрезки, ошибок не будет — данная часть изображения просто будет окрашена в черный цвет.
1 2 3 4 5 6 |
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) |
Обрезка изображения по центру в PIL
Если вы хотите вырезать центр изображения определенного размера, то функция crop_center
поможет в решении этой задачи:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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) |
Вырезаем квадрат из прямоугольника
При создании миниатюр записей для блога на Django, зачастую требуется вырезать максимально возможный квадрат из прямоугольного изображения.
Создаем функцию, которая обрезает квадрат из центра прямоугольного изображения:
1 2 |
def crop_max_square(pil_img): return crop_center(pil_img, min(pil_img.size), min(pil_img.size)) |
Пример использования данной функции:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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) |
Результатом этого кода будет данная картинка:
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»