2009-04-02 7 views
4

Я хочу обрезать уменьшенное изображение в моем приложении Django, чтобы получить квадратичное изображение, отображающее центр изображения. Я не согласен с этим.Что является более элегантным перефразированием этого алгоритма обрезки? (в Python)

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

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) 

Есть ли у вас какие-либо идеи, так?

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

ответ

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) 
+0

Мне нравится иметь переменные ширины и высоты, явно названные. В противном случае кто-то, читающий этот код, должен найти документацию для Image.Size – Triptych

+0

Может быть, есть свойства image.Width и image.Height, но я не знаю. Я просто вывел код из qustion. –

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 
6

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

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

Хм .. на самом деле это не создает квадратные изображения. Или я чего-то не хватает? – winsmith

+0

Функция fit() возвращает новый объект изображения, я забыл упомянуть об этом. Может быть, это так? – Steef

+0

Это решило мою проблему в точности. –

0

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