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

Масштабирование изображений с модулем Pillow в Python

Изменение размера изображения при помощи Pillow

В материале рассмотрены три функции ImageOps.scale(), ImageOps.contain() и ImageOps.pad() модуля Pillow, которые позволяют изменять размеры изображения с сохранением исходного соотношения сторон. Другими словами - масштабировать изображения.

Содержание:


ImageOps.scale(image, factor, resample=Resampling.BICUBIC):

Метод ImageOps.scale() возвращает масштабированное изображение с определенным коэффициентом, указанным в параметре factor.

Коэффициент factor больше 1 расширяет изображение, от 0 до 1 сжимает изображение.

Принимаемые аргументы:

  • image: Изображение для изменения масштаба.
  • factor: Коэффициент расширения, как float.
  • resample: Используемый метод повторной выборки. По умолчанию используется Image.BICUBIC.

Пример использования:

from PIL import Image, ImageGrab, ImageOps

# создание скриншота
img_orig = ImageGrab.grab()
print(f'Исходный размер: {img_orig.size}')
img_orig.save('test_orig.png')

# уменьшим скриншот в 2 раза
img = ImageOps.scale(img_orig, 0.5, resample=Image.LANCZOS)
print(f'Размер после изменения: {img.size}')
# сохраним для сравнения
img.save('test_scale_lower.png')

# увеличим скриншот в 2 раза
img = ImageOps.scale(img_orig, 2, resample=Image.LANCZOS)
print(f'Размер после изменения: {img.size}')
# сохраним для сравнения
img.save('test_scale_bigger.png')

ImageOps.contain(image, size, method=Resampling.BICUBIC):

Метод ImageOps.contain() возвращает измененную версию изображения с максимальной шириной и высотой в пределах запрошенного размера size, сохраняя при этом исходное соотношение сторон.

Принимаемые аргументы:

  • image: Изображение для изменения размера.
  • size: Запрошенный размер вывода в пикселях, заданный в виде кортежа (width, height).
  • method: Используемый метод повторной выборки. По умолчанию Image.BICUBIC.

Пример использования:

from PIL import Image, ImageGrab, ImageOps

# создание скриншота
img_orig = ImageGrab.grab()
print(f'Исходный размер: {img_orig.size}')
img_orig.save('test_orig.png')

# впишем скриншот в квадрат 1000x1000 пикселей
img = ImageOps.contain(img_orig, (1000, 1000), method=Image.LANCZOS)
print(f'Размер после изменения: {img.size}')
# сохраним для сравнения
img.save('test_1000.png')

# впишем скриншот в квадрат 3000x3000 пикселей
img = ImageOps.contain(img_orig, (3000, 3000), method=Image.LANCZOS)
print(f'Размер после изменения: {img.size}')
# сохраним для сравнения
img.save('test_3000.png')

ImageOps.pad(image, size, method=Resampling.BICUBIC, color=None, centering=(0.5, 0.5)):

Метод ImageOps.pad() возвращает измененную и дополненную версию изображения, расширенную для заполнения требуемого соотношения сторон и размера.

Принимаемые аргументы:

  • image: Изображение для изменения размера.
  • size: Запрошенный размер вывода в пикселях, заданный в виде кортежа (width, height).
  • method: Используемый метод повторной выборки. По умолчанию Image.BICUBIC.
  • color: Цвет фона дополненного изображения
  • centering: управляет положением исходного изображения в дополненной версии.
    • (0,5, 0,5) - сохранит изображение по центру
    • (0, 0) сохранит выравнивание изображения по верхнему левому краю
    • (1, 1) сохранит выравнивание изображения по нижнему правому краю

Пример использования:

from PIL import Image, ImageGrab, ImageOps

# создание скриншота
img_orig = ImageGrab.grab()
print(f'Исходный размер: {img_orig.size}')
img_orig.save('test_orig.png')

# впишем скриншот в квадрат 1000x1000 пикселей
img = ImageOps.pad(img_orig, (1000, 1000), color='#ffffff', 
                   method=Image.LANCZOS)
print(f'Размер после изменения: {img.size}')
# сохраним для сравнения
img.save('test_1000x1000.png')

# впишем скриншот в прямоугольник 2500x1000 пикселей
img = ImageOps.pad(img_orig, (2500, 1000), color='#ffffff', 
                   method=Image.LANCZOS)
print(f'Размер после изменения: {img.size}')
# сохраним для сравнения
img.save('test_2500x1000.png')

# зададим размеры пропорциональные размерам скриншота
size = (img_orig.size[0]*2, img_orig.size[1]*2)
img = ImageOps.pad(img_orig, size, color='#ffffff', 
                   method=Image.LANCZOS)
print(f'Размер после изменения: {img.size}')
# сохраним для сравнения
img.save(f'test_{img_orig.size[0]*2}.png')