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