Categories: Python

Изменение размера изображения в Python

В процессе разработки этого блога я столкнулся с необходимостью автоматического ресайза изображений. После непродолжительных поисков подходящей либо я обратил внимание на PIL (Python Imaging Library).

Для начала установим PIL. Обратите внимание, что PIL, больше не поддерживается, вместо него сейчас можно найти «дружеское ответвление» Pillow. Чтобы установить PIL на Debian, выполните следующую команду в терминале от root’a:

aptitude install python-imaging

Я использовал PIL для строгово изменения размера изображения 64х64 для аватаров пользователей.

from PIL import Image

img = Image.open('image.png')
width = 64
height = 64
resized_img = img.resize((width, height), Image.ANTIALIAS)
resized_img.save(image.png)

Вот так очень просто мы поменяли размер изображения на 64×64.

Так же мне в дальнейшем мне понадобилось изменять размер изображения с сохранение пропорций. И тут также мне на помощь пришел PIL.

Код для изменения размера изображения с сохранением пропорций:

from PIL import Image

width = 750

img = Image.open('image.jpg')
ratio = (basewidth / float(img.size[0]))
height = int((float(img.size[1]) * float(ratio)))

img = img.resize((basewidth, height), PIL.Image.ANTIALIAS)

img.save('resized_image.jpg')

Вот так с помощью PIL мы в несколько строк изменили размер изображения (image.jpg) до ширины в 750 пикселей. Данную ширину мы установили в переменной width. Высота, пропорциональная ширине вычисляется путем определения, соотношения оригинальной ширины изображения (img.size [0]) к величине указанной в переменной width (в нашем случае 300px), а затем умножением этой величины на исходную высоту изображения (img.size [1]). Полученное значение высоты хранится в переменной height.

Итак управляя переменной width, можно получать любые другие размеры итогового изображения. Так же обратите внимание, что я сохранил исходное изображение по именем resized_image.jpg, в случае необходимости его дальнейшего использования. В случае если исходное изображение больше не нужно — можно перезаписать полученное изображение с таким же именем.

Чтобы оставить высоту изображения фиксированной и пропорционально изменять ее ширину, немного изменим код.

height = 300
img = Image.open('image.jpg')
ratio = (baseheight / float(img.size[1]))
width = int((float(img.size[0]) * float(hpercent)))
img = img.resize((width, height), PIL.Image.ANTIALIAS)
img.save('resized_image.jpg')


Обратите внимание. Здесь для вычисления соотношения высоты мы обращаемся не к img.size [0], а к img.size [1]. Атрибут size является кортежем хранящим ширину в первом элементе [0] и высоту во втором [1].

Вот и все. И это далеко не все возможности PIL.

admin

Recent Posts

vim-commands/

Самое главное — побороть боязнь белого листа. Я всегда говорю это себе, когда нужно начать…

4 недели ago

firefox-thunderbird-en-ru-dict/

По не вполне ясным причинам, Firefox умеет проверять орфографию либо только в русских, либо только…

4 недели ago

perl-hacks/

Около месяца собирал разные «хаки» на языке программирования Perl. Эта подборка наглядно демонстрирует, как в…

4 недели ago

perl-cy-check/

C недавних пор я стал увлекаться SEO. Порой передо мной встает задача быстро проверить индекс…

4 недели ago

which-cms-perl/

Недавно написал несколько скриптов, позволяющих автоматически определять, какая CMS (Content Management System, система управления контентом)…

4 недели ago

smtp-descr/

Я так подозреваю, что среди вас найдется те, кто скажет, что этот пост боян и…

4 недели ago