在缩放图片之前,您需要正确地裁剪图片。基本思想是确定源图像的最大矩形区域,该区域与缩略图图像具有相同的宽高比,然后在将其调整为缩略图尺寸之前裁剪掉(裁剪)其周围的任何多余部分。这是一个可以计算出这种裁剪区域大小和位置的函数:
def cropbbox(imagewidth,imageheight, thumbwidth,thumbheight):
""" cropbbox(imagewidth,imageheight, thumbwidth,thumbheight)
Compute a centered image crop area for making thumbnail images.
imagewidth,imageheight are source image dimensions
thumbwidth,thumbheight are thumbnail image dimensions
Returns bounding box pixel coordinates of the cropping area
in this order (left,upper, right,lower).
"""
fx = float(imagewidth)/thumbwidth
fy = float(imageheight)/thumbheight
f = fx if fx < fy else fy
cropheight,cropwidth = int(thumbheight*f),int(thumbwidth*f)
dx = (imagewidth-cropwidth)/2
dy = (imageheight-cropheight)/2
return dx,dy, cropwidth+dx,cropheight+dy
if __name__=='__main__':
print("===")
bbox = cropbbox(1024,768, 128,128)
print("cropbbox(1024,768, 128,128): {}".format(bbox))
print("===")
bbox = cropbbox(768,1024, 128,128)
print("cropbbox(768,1024, 128,128): {}".format(bbox))
print("===")
bbox = cropbbox(1024,1024, 96,128)
print("cropbbox(1024,1024, 96,128): {}".format(bbox))
print("===")
bbox = cropbbox(1024,1024, 128,96)
print("cropbbox(1024,1024, 128,96): {}".format(bbox))
确定作物区域之后,调用
im.crop(bbox)
,然后在返回的图像上调用
im.thumbnail(...)
。