您需要在调整大小之前正确裁剪图像。基本思想是确定源图像的最大矩形区域,该区域的纵横比(宽高比)与缩略图图像相同,然后在调整为缩略图尺寸之前将其周围的任何多余部分修剪(裁剪)。这是一个函数,它将计算此类裁剪区域的大小和位置:
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). """ # determine scale factor fx = float(imagewidth)/thumbwidth fy = float(imageheight)/thumbheight f = fx if fx < fy else fy # calculate size of crop area cropheight,cropwidth = int(thumbheight*f),int(thumbwidth*f) # for centering use half the size difference of the image and the crop area dx = (imagewidth-cropwidth)/2 dy = (imageheight-cropheight)/2 # return bounding box of centered crop area on source image return dx,dy, cropwidth+dx,cropheight+dyif __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(...)返回的图像。



