В материале рассмотрены функции ImageOps.crop()
, ImageOps.expand()
и ImageOps.fit()
модуля Pillow
, которые позволяют добавлять рамку изображения и обрезать по указанной рамке.
ImageOps.crop()
удаляется одинаковое количество пикселей со всех сторон,ImageOps.expand()
добавляет к изображению рамку,ImageOps.fit()
изменяет и обрезает изображение до требуемого соотношения сторон и размера.ImageOps.crop(image, border=0)
:Метод ImageOps.crop()
возвращает изображение с удаленной границей размером border
.
Со всех четырех сторон удаляется одинаковое количество пикселей border
. Эта функция работает во всех режимах изображения.
Принимаемые аргументы:
image
: Изображение для обрезки.border
: Количество пикселей для удаления.Пример использования ImageOps.crop()
:
from PIL import ImageGrab, ImageOps # создание скриншота img_orig = ImageGrab.grab() print(f'Исходный размер: {img_orig.size}') img_orig.save('test_orig.png') # отрезаем по периметру картинки # рамку в 15 пикселей img = ImageOps.crop(img_orig, border=15) print(f'Размер после изменения: {img.size}') # сохраним для сравнения img.save('test_crop_15.png') # отрезаем по периметру картинки # рамку в 100 пикселей img = ImageOps.crop(img_orig, border=100) print(f'Размер после изменения: {img.size}') # сохраним для сравнения img.save('test_crop_100.png')
ImageOps.expand(image, border=0, fill=0)
:Метод ImageOps.expand()
расширяет изображение на границу цветом fill
в border
пикселей.
Другими словами, добавляет к изображению рамку толщиной border
пикселей и цветом fill
Принимаемые аргументы:
image
: Изображение для расширения.border
: Ширина границы, в пикселях.fill
: Значение пиксельной заливки (значение цвета). Значение по умолчанию равно 0 (черный).Пример использования ImageOps.expand()
:
from PIL import ImageGrab, ImageOps # создание скриншота img_orig = ImageGrab.grab() print(f'Исходный размер: {img_orig.size}') img_orig.save('test_orig.png') # создадим белую рамку вокруг # скриншота размером в 10 пикселей img = ImageOps.expand(img_orig, border=10, fill='#ffffff') print(f'Размер после изменения: {img.size}') # сохраним для сравнения img.save('test_expand_10.png') # создадим белую рамку вокруг # скриншота размером в 25 пикселей img = ImageOps.expand(img_orig, border=25, fill='#ffffff') print(f'Размер после изменения: {img.size}') # сохраним для сравнения img.save('test_expand_25.png')
ImageOps.fit(image, size, method=Resampling.BICUBIC, bleed=0.0, centering=(0.5, 0.5))
:Метод ImageOps.fit()
возвращает измененную и обрезанную до требуемого соотношения сторон и размера версию изображения.
Принимаемые аргументы:
image
: Изображение для изменения размера и обрезки.size
: Запрошенный размер вывода в пикселях, заданный в виде кортежа (width, height)
.method
: Используемый метод повторной выборки. По умолчанию Image.BICUBIC
.bleed
: удаляет границу вокруг внешней стороны изображения со всех четырех краев. Значение представляет собой десятичный процент (0,01 для одного процента). Значение по умолчанию - 0 (без границы). Внимание! Не может быть больше или равно 0,5.centering
: контролирует положение обрезки.(0,5, 0,5)
- для обрезки по центру (например, при обрезке по ширине уберите 50% с левой стороны и, следовательно, 50% с правой стороны).(0.0, 0.0)
- будет обрезать верхний левый угол (т. е. если обрезать ширину, то уберет все с правой стороны, а если обрезать высоту, то уберет все снизу). (1.0, 0.0)
- будет обрезать нижний левый угол (т. е. при обрезке ширины уберет все с левой стороны, а при обрезке высоты ничего не убрать сверху, и, следовательно, все снизу) .Пример использования ImageOps.fit()
:
Непонятно как эта функция отрезает, но для кого то будет наверное очень полезна...
from PIL import Image, ImageGrab, ImageOps # создание скриншота img_orig = ImageGrab.grab() print(f'Исходный размер: {img_orig.size}') img_orig.save('test_orig.png') # впишем скриншот в квадрат 2500x1000 пикселей # при этом bleed=0.01, centering=(0.5, 0.5) img = ImageOps.fit(img_orig, (2500, 1000), method=Image.LANCZOS, bleed=0.01, centering=(0.5, 0.5)) print(f'Размер после изменения: {img.size}') # сохраним для сравнения img.save('test_crop_0505.png') # centering=(1, 0) img = ImageOps.fit(img_orig, (2500, 1000), method=Image.LANCZOS, bleed=0.01, centering=(1, 0)) print(f'Размер после изменения: {img.size}') # сохраним для сравнения img.save('test_crop_10.png') # centering=(0, 1) img = ImageOps.fit(img_orig, (2500, 1000), method=Image.LANCZOS, bleed=0.01, centering=(0, 1)) print(f'Размер после изменения: {img.size}') # сохраним для сравнения img.save(f'test_crop_01.png') # centering=(0, 0) img = ImageOps.fit(img_orig, (2500, 1000), method=Image.LANCZOS, bleed=0.01, centering=(0, 0)) print(f'Размер после изменения: {img.size}') # сохраним для сравнения img.save(f'test_crop_00.png')