Уменьшение ширины / высоты изображения для соответствия заданному соотношению сторон.Как?- миниатюры изображений Python - PullRequest
2 голосов
/ 20 января 2011
import Image

image  = Image.open('images/original.jpg')
width  = image.size[0]
height = image.size[1]

if width > height:
    difference = width - height
    offset     = difference / 2
    resize     = (offset, 0, width - offset, height)

else:
    difference = height - width
    offset     = difference / 2
    resize     = (0, offset, width, height - offset)

thumb = image.crop(resize).resize((200, 200), Image.ANTIALIAS)
thumb.save('thumb.jpg')

Это мой текущий скрипт создания миниатюр.Вот как это работает:

Если у вас есть изображение размером 400x300, и вы хотите использовать миниатюру размером 100x100, то на левой и правой стороне исходного изображения вы получите 50 пикселей.Таким образом, изменение его размера должно быть 300x300.Это дает исходное изображение такое же соотношение сторон, как новый эскиз.После этого он уменьшится до требуемого размера миниатюр.

Преимущества этого:

  • Миниатюра берется из центра изображения
  • Соотношение сторон не искажается

Если вы уменьшите изображение 400x300 до 100x100, оно будет выглядеть сжатым.Если вы взяли миниатюру с координат 0x0, вы получите верхний левый угол изображения.Обычно фокусом изображения является центр.

То, что я хочу сделать, это дать сценарию ширину / высоту любого соотношения сторон.Например, если бы я хотел, чтобы размер 400x300 был изменен до 400x100, он должен срезать 150 пикселей с левой и правой сторон изображения ...

Я не могу придумать, как это сделать.Есть идеи?

1 Ответ

13 голосов
/ 20 января 2011

Вам просто нужно сравнить пропорции - в зависимости от того, какое из них больше, это скажет вам, нужно ли отрубать боковые стороны или сверху и снизу. например как насчет:

import Image

image  = Image.open('images/original.jpg')
width  = image.size[0]
height = image.size[1]

aspect = width / float(height)

ideal_width = 200
ideal_height = 200

ideal_aspect = ideal_width / float(ideal_height)

if aspect > ideal_aspect:
    # Then crop the left and right edges:
    new_width = int(ideal_aspect * height)
    offset = (width - new_width) / 2
    resize = (offset, 0, width - offset, height)
else:
    # ... crop the top and bottom:
    new_height = int(width / ideal_aspect)
    offset = (height - new_height) / 2
    resize = (0, offset, width, height - offset)

thumb = image.crop(resize).resize((ideal_width, ideal_height), Image.ANTIALIAS)
thumb.save('thumb.jpg')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...