Прежде всего, название вашей функции вводит в заблуждение, потому что это не почтовый ящик изображения (независимо от конкретной высоты / ширины [соотношения сторон]) -поэтому здесь он был переименован в aspectcrop()
, чтобы лучше описать, что он делает.
def aspectcrop(f, ratio=1.0):
try:
im = Image.open(StringIO(f))
imagewidth,imageheight = im.size
# determine the dimensions of a crop area
# which is no wider or taller than the image
if int(imagewidth*ratio) > imageheight:
cropheight,cropwidth = imageheight,int(imageheight/ratio)
else:
cropwidth,cropheight = imagewidth,int(imagewidth*ratio)
# center the crop area on the image (dx and/or dy will be zero)
dx,dy = (imagewidth-cropwidth)/2,(imageheight-cropheight)/2
# crop, save, and return image data
im = im.crop((dx,dy,cropwidth+dx,cropheight+dy))
new_file = StringIO()
im.save(new_file,'JPEG')
new_file.seek(0)
except Exception, e:
new_file = None # prevent exception on return
pass
return new_file
Если любой аргумент аспекта ratio
, который вы передаете ему, не является целым числом, убедитесь, что он находится в плавающей запятой, так какв 3./2.
не 3/2
.По умолчанию (1.0
) могло бы быть целое число, но я явно сделал это с плавающей точкой в качестве напоминания.Возможно, было бы лучше передать его в виде двух отдельных целых чисел и вычислить соотношение для внутреннего использования.
Наконец, я заметил, что в вашем примере сценария есть некоторые видимые следы того, что выглядит как попытка создать эскиз изображения,поэтому мой ответ на связанный вопрос Какой самый простой способ в Python изменить размер изображения до заданной ограниченной области? также может представлять интерес (и, вероятно, может быть интегрирован в эту функцию безслишком много проблем).