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

问题描述 投票:2回答:1

我想创建一个函数,如:

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")

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

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

在给出矩形图像并且需要正方形调整大小(宽度=高度)的情况下,必须进行一些中心加权裁剪。

python imaging image-resizing python-imaging-library
1个回答
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(...)

© www.soinside.com 2019 - 2024. All rights reserved.