Работа с изображением – необходимая составляющая любой программы. В этом нет ничего удивительного, поскольку в свое время именно графические интерфейсы стали ключевым этапом перехода от командной строки до операционных систем в том виде, котором мы их знаем. И картинки являются основополагающей составляющей таких интерфейсов.
Если вы хотите поворачивать изображение на определенный градус, необходимо воспользоваться методом rotate() из модуля Image. Сегодня рассмотрим такие важные аспекты его использования, как настройка угла вращения изображения, как осуществить полный поворот изображения, какие бывают фильтры и зачем они нужны, как изменять центр изображения в процессе его поворачивания, а также как смещать картинку при поворачивании.
Для работы с сегодняшним уроком нам понадобится следующая картинка:
Сохраните ее на свой компьютер. Она будет использоваться в приведенных ниже фрагментах кода.
Настройка угла вращения изображения
Для того, чтобы вращать картинку, необходимо сначала определиться с углом, на который будет осуществляться поворот. Для этого существует специальная функция, которую мы рассмотрим более подробно далее. Она является методом. Следовательно, вызывается из объекта image, через точку.
Но на данном этапе еще рано говорить об этом методе. Для начала необходимо сохранить картинку и открыть ее. Давайте теперь попробуем это сделать, для начала.. Для этого поместите его в тот каталог, в котором будет выполняться программа.
from PIL import Image im = Image.open('guido-van-rossum.jpg') im.show()
Если мы запустим этот код, будет показана скачанная на предыдущем этапе картинка.
Итак, что нам надо для настройки угла вращения изображения в Pillow? Прежде всего, воспользоваться методом rotate(), в качестве аргумента которого используется угол вращения картинки в градусах. Вращаться картинка будет против часовой стрелки.
Давайте для примера попробуем повернуть картинку на 90 градусов.
from PIL import Image im = Image.open('guido-van-rossum.jpg') im_rotate = im.rotate(90) im_rotate.save('guido_90.jpg', quality=95) im.close()
После того, как мы запустим этот фрагмент кода, мы получим изображение, которое будет повернуто на 90 градусов против часовой стрелки.
А теперь давайте повернем нашу картинку на 45 градусов. Для этого изменим код, который выше, таким образом, чтобы в качестве аргумента метода rotate() было число 45.
from PIL import Image im = Image.open('guido-van-rossum.jpg') im_rotate = im.rotate(45) im_rotate.save('guido_45.jpg', quality=95) im.close()
Как полностью повернуть изображение?
Обратите внимание, что стандартный размер готового изображения должен равняться размеру первоначального, а части повернутой картинки, которые попали за пределы изначального размера, отсекаются. А что же делать, если поставить параметр expand на True? В этом случае картинка будет полностью помещаться в область видимости. По сторонам уже черных границ не будет.
Для того, чтобы убедиться в этом, попробуйте у себя запустить следующий код.
from PIL import Image im = Image.open('guido-van-rossum.jpg') im_rotate = im.rotate(90, expand=True) im_rotate.save('guido_expand_90.jpg', quality=95) im.close()
И наша картинка теперь будет такой. Обратите внимание, что действительно черных полос по бокам нет. Но так лишь в случае, если картинка расположена по одной из осей – абсцисс или ординат.
А вот если угол другой, например, если повернуть картинку на 45 градусов, то тогда избежать черных пространств за пределами картинки не получится. Это четко видно на картинке, которую мы привели выше.
Тем не менее, изображение все равно будет полностью помещаться в окне.
Попробуйте выполнить этот код, и вы убедитесь в этом самостоятельно.
Видим, что нет ничего сложного в том, чтобы повернуть изображение так, чтобы оно органично вписывалось в интерфейс программы.
Зачем нужны фильтры в Pillow?
При поворачивании изображения можно использовать фильтры, чтобы сделать получившуюся картинку более качественной. Для того, чтобы их задать, необходимо воспользоваться параметром resample. Фильтры, в свою очередь, могут быть следующими. Качество их работы зависит от картинки, которая используется. То есть, на одной картинке нет необходимости вообще использовать фильтр, отличный от того, который устанавливается по умолчанию. На другой же качество изображения можно значительно улучшить, если использовать его. Сами же фильтры, доступные для использования пользователем Python, следующие.
- Image.NEAREST – этот фильтр используется по умолчанию. Касается ближайшего соседа.
- Image.BILINEAR. Делает детали изображения более четкими при повороте по сравнению с предыдущим фильтром.
- Image.BICUBIC.
from PIL import Image im = Image.open('guido-van-rossum.jpg') im_rotate = im.rotate(45, expand=True, resample=Image.BICUBIC) im_rotate.save('guido_resample_bicubic.jpg', quality=95) im.close()
Давайте наглядно покажем разницу между этими фильтрами.
В случае с этой картинкой различия не так заметны, но они есть. Тем не менее, обратите, например, внимание на фильтр Image.BILINEAR. Картинка с его помощью стала более гладкой.
Изменение центра картинки при переворачивании
А что нужно делать, чтобы уточнить позицию центра изображения, которое добавляется в приложение? Для этого необходимо использовать параметр center в методе rotate(). Приведем для наглядности код, где это наглядно изображено.
from PIL import Image im = Image.open('guido-van-rossum.jpg') im_rotate = im.rotate(45, center=(0, 100)) im_rotate.save('guido_new_center.jpg', quality=95) im.close()
Здесь мы видим, что после того, как мы запустили этот код, позиция изображения изменилась по сравнению с той, которая была ранее. Попробуйте выполнить этот код, используя скачанную ранее картинку, и убедитесь в этом сами. Также можете потренироваться на любом другом изображении, разницы здесь особой нет для того, чтобы эффективно обучаться.
Если мы используем значение True для параметра expand, то область выходящего изображения определяется предположением, что изображение обращается, ориентируясь на свой изначальный центр.
from PIL import Image im = Image.open('guido-van-rossum.jpg') im_rotate = im.rotate(45, expand=True, center=(0, 100)) im_rotate.save('guido_new_center_expand.jpg', quality=95) im.close()
Смещение картинки во время поворота
Также человек, разрабатывающий приложение, может указать определенное смещение перед тем, как картинка будет поворачиваться. Для этого используется параметр translate. С его помощью можно добиться того, например, чтобы картинка после поворота оказалась в определенной части экрана. Таким образом можно добиться двух целей: повернуть изображение на определенный градус и переместить его. Нет необходимости отдельно прописывать две строчки кода, можно обойтись одной. Согласитесь, это удобно, не так ли?
Давайте теперь попробуем показать, как работает этот параметр, на практике. Для этого мы просто покажем то, какое смещение нам требуется. Да, функцию rotate() можно использовать и для обычного перемещения изображения в пределах экрана. Мы так и сделаем.
from PIL import Image im = Image.open('guido-van-rossum.jpg') im_rotate = im.rotate(0, translate=(100, 50)) im_rotate.save('guido_translate_0.jpg', quality=95) im.close()
В результате, наша программа будет выглядеть таким образом, как на этом изображении.
Если же нам нужно повернуть картинку на 45 градусов со смещением, то для этого необходимо просто задать нужный градус в качестве первого аргумента метода rotate().
from PIL import Image im = Image.open('guido-van-rossum.jpg') im_rotate = im.rotate(45, translate=(100, 50)) im_rotate.save('guido_translate_45.jpg', quality=95) im.close()
Получим такой результат. Выглядит привлекательно, не так ли?
Если мы используем установим значение параметра expand на True, то для определения итоговой области картинки интерпретатор будет считать, что смещения нет.
Для демонстрации этого эффекта давайте приведем такой фрагмент кода.
from PIL import Image im = Image.open('guido-van-rossum.jpg') im_rotate = im.rotate(45, translate=(100, 50), expand=True) im_rotate.save('guido_translate_expand_45.jpg', quality=95) im.close()
В результате выполнения этих инструкций появится такая картинка. Вы можете самостоятельно в этом убедиться.
В этом примере, в отличие от предыдущего, черный фон находится как в верхнем левом углу, так и в правом нижнем. В прошлом же случае картинка размещалась от одного края окна до другого.
Выводы
Мы разобрали, как поворачивать изображения в Python, как использовать фильтры, перемещать картинку, каким образом можно полностью вписать изображение в окно, даже после поворачивания. Все это можно сделать с помощью метода rotate(). Он может использоваться как для поворота картинки, так и для ее смещения, и это очень удобно.
Попробуйте потренироваться с приведенным выше кодом таким образом. Поставьте себе задачу применительно к теме этой статьи. После этого подумайте, как сегодняшний материал может использоваться, применительно к вашей задаче. Тренировка – это важная составляющая обучения, поскольку именно во время нее совершение тех или иных действий доводится до автоматизма. В дальнейшем все будет делаться как бы само собой, без активных размышлений с вашей стороны.