В процессе разработки этого блога я столкнулся с необходимостью автоматического ресайза изображений. После непродолжительных поисков подходящей либо я обратил внимание на 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.