Какое изящное перефразирование этого алгоритма обрезки? (в Python) - PullRequest
4 голосов
/ 02 апреля 2009

Я хочу обрезать миниатюру изображения в моем приложении Django, чтобы получить квадратное изображение, показывающее центр изображения. Это не очень сложно, я согласен.

Я уже написал некоторый код, который делает именно это, но почему-то ему не хватает определенной ... элегантности. Я не хочу играть в гольф, но должен быть способ выразить это более коротким и питоническим, я думаю.

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)

У вас есть идеи, ТАК?

редактировать: объяснил х, у

Ответы [ 4 ]

9 голосов
/ 02 апреля 2009

Я думаю, что это должно сделать.

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)
6 голосов
/ 02 апреля 2009

Функция fit() в модуле PIL ImageOps делает то, что вы хотите:

ImageOps.fit(image, (min(*image.size),) * 2, Image.ANTIALIAS, 0, (.5, .5))
1 голос
/ 02 апреля 2009
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
0 голосов
/ 24 августа 2009

Я хочу провести анализ содержимого изображения в формате jepg. Я хочу взять jpeg imafe, скажем, 251 x 261, и передать его через алгоритм, чтобы обрезать его, скажем, 96 x 87. Может ли эта программа сделать это, как написать интеллектуальный алгоритм обрезки, с предложением изменить изображение.

...