Сообщить об ошибке.

Добавить/обрезать рамку изображения, модуль Pillow в Python

В материале рассмотрены функции ImageOps.crop(), ImageOps.expand() и ImageOps.fit() модуля Pillow, которые позволяют добавлять рамку изображения и обрезать по указанной рамке.

Содержание:


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')