将图像大小调整到给定有界区域的最简单方法是什么?

时间:2010-10-06 14:59:18

标签: python imaging image-resizing python-imaging-library

我想创建一个函数,如:

def generateThumbnail(self, width, height):
     """
     Generates thumbnails for an image
     """
     im = Image.open(self._file)
     im.thumbnail((width, height), Image.ANTIALIAS)
     im.save(self._path + str(width) + 'x' + 
             str(height) + '-' + self._filename, "JPEG")

可以给出文件并调整其大小。

当前功能很有效,但必要时不会裁剪。

如果给出了矩形图像,并且需要调整方形大小(宽度=高度),则必须进行一些居中加权裁剪。

1 个答案:

答案 0 :(得分:5)

您需要在调整图像大小之前正确裁剪图像。基本思想是确定具有与缩略图图像相同的纵横比(宽高比)的源图像的最大矩形区域,然后在调整缩略图的尺寸之前修剪(裁剪)其周围的任何多余部分。这是一个计算这种裁剪区域大小和位置的函数:

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+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(...)