Ответ 1
Вот мое занятие по заполнению подгонки для изображения:
#!/usr/bin/env python
from PIL import Image, ImageChops
F_IN = "/path/to/image_in.jpg"
F_OUT = "/path/to/image_out.jpg"
size = (80,80)
image = Image.open(F_IN)
image.thumbnail(size, Image.ANTIALIAS)
image_size = image.size
thumb = image.crop( (0, 0, size[0], size[1]) )
offset_x = max( (size[0] - image_size[0]) / 2, 0 )
offset_y = max( (size[1] - image_size[1]) / 2, 0 )
thumb = ImageChops.offset(thumb, offset_x, offset_y)
thumb.save(F_OUT)
Сначала он использует операцию миниатюр, чтобы довести изображение до исходных границ и сохранить его. Затем он выгружает его обратно, чтобы на самом деле заполнить размер ваших границ (поскольку, если исходное изображение не было квадратным, оно теперь будет меньше), и мы найдем правильный смещение, чтобы центрировать изображение. Изображение смещено к центру, поэтому вы получаете черное дополнение, но не обрезаете изображение.
Если вы не можете сделать действительно разумное предположение о правильном посещении центра, не теряя при этом возможных важных данных изображения по краям, подход с подгонной подгонкой будет работать лучше.
Обновление
Здесь приведена версия, которая может делать либо центральную обрезку, либо подгонку подкладки.
#!/usr/bin/env python
from PIL import Image, ImageChops, ImageOps
def makeThumb(f_in, f_out, size=(80,80), pad=False):
image = Image.open(f_in)
image.thumbnail(size, Image.ANTIALIAS)
image_size = image.size
if pad:
thumb = image.crop( (0, 0, size[0], size[1]) )
offset_x = max( (size[0] - image_size[0]) / 2, 0 )
offset_y = max( (size[1] - image_size[1]) / 2, 0 )
thumb = ImageChops.offset(thumb, offset_x, offset_y)
else:
thumb = ImageOps.fit(image, size, Image.ANTIALIAS, (0.5, 0.5))
thumb.save(f_out)
source = "/path/to/source/image.JPG"
makeThumb(source, "/path/to/source/image_padded.JPG", pad=True)
makeThumb(source, "/path/to/source/image_centerCropped.JPG", pad=False)