什么是这种裁剪算法的更优雅的改述? (在Python中)

时间:2009-04-02 11:50:50

标签: image python-imaging-library python crop

我想在我的Django应用程序中裁剪缩略图,以便获得显示图像中心的二次图像。我同意,这不是很难。

我已经编写了一些完全符合这一要求的代码,但不知何故它缺乏某种优雅。我不想打代码高尔夫球,但我认为必须有一种方法来表达这种更短更多的pythonic。

x = y = 200 # intended size
image = Image.open(filename)
width = image.size[0]
height = image.size[1]
if (width > height):
    crop_box = ( ((width - height)/2), 0, ((width - height)/2)+height, height )
    image = image.crop(crop_box)
elif (height > width):
    crop_box = ( 0, ((height - width)/2), width, ((height - width)/2)+width )
    image = image.crop(crop_box)
image.thumbnail([x, y], Image.ANTIALIAS)

你有什么想法,那么?

编辑解释x,y

4 个答案:

答案 0 :(得分:9)

我认为应该这样做。

size = min(image.Size)

originX = image.Size[0] / 2 - size / 2
originY = image.Size[1] / 2 - size / 2

cropBox = (originX, originY, originX + size, originY + size)

答案 1 :(得分:6)

PIL ImageOps模块中的fit()功能可以满足您的需求:

ImageOps.fit(image, (min(*image.size),) * 2, Image.ANTIALIAS, 0, (.5, .5))

答案 2 :(得分:1)

width, height = image.size
if width > height:
    crop_box = # something 1
else:
    crop_box = # something 2
image = image.crop(crop_box)
image.thumbnail([x, x], Image.ANTIALIAS)   # explicitly show "square" thumbnail

答案 3 :(得分:0)

我想对jepg图像进行内容分析。我希望采用一个jpeg imafe说251 x 261并通过算法将其裁剪为96 x 87.这个程序可以像写一个智能裁剪算法一样,并提示重新生成图像。