Переворот изображения по вертикали и горизонтали в Pillow Python
Чтобы перевернуть изображение по вертикали или горизонтали с помощью Pillow Python, используйте метод transpose() для объекта изображения PIL.
Синтаксис
Синтаксис метода transpose():
Image.transpose(method)
- method – возможные значения метода:
- PIL.Image.FLIP_LEFT_RIGHT;
- PIL.Image.FLIP_TOP_BOTTOM;
- PIL.Image.ROTATE_90;
- PIL.Image.ROTATE_180;
- PIL.Image.ROTATE_270;
- PIL.Image.TRANSPOSE или PIL.Image.TRANSVERSE.
В этом уроке мы будем иметь дело только с FLIP_LEFT_RIGHT, который переворачивает изображение относительно вертикальной оси и FLIP_TOP_BOTTOM, который переворачивает изображение относительно горизонтальной оси.
Пример 1:по вертикальной оси
В следующем примере мы передаем FLIP_LEFT_RIGHT в качестве аргумента методу транспонирования, чтобы перевернуть изображение по вертикали или слева направо и справа налево.
import PIL from PIL import Image #read the image im = Image.open("sample-image.png") #flip image out = im.transpose(PIL.Image.FLIP_LEFT_RIGHT) out.save('transpose-output.png')

Пример 2: по горизонтальной оси
В следующем примере мы передаем FLIP_TOP_BOTTOM в качестве аргумента методу транспонирования, чтобы перевернуть изображение по горизонтальной оси или перевернуть изображение сверху вниз и снизу вверх.
import PIL from PIL import Image #read the image im = Image.open("sample-image.png") #flip image out = im.transpose(PIL.Image.FLIP_TOP_BOTTOM) out.save('transpose-output.png')
В этом уроке на примерах Python мы узнали, как транспонировать изображение и, таким образом, получить эффект переворачивания по вертикальной и горизонтальной осям.
Диагональное отражение Python
В файле image.jpg лежит изображение с одинаковой шириной и высотой. Зеркально отразите его относительно побочной диагонали — прямой, идущей из правого верхнего угла к левому нижнему углу картинки. Для этого напишите функцию mirror(), в которой прочитайте изображение из файла image.jpg, преобразуйте его и сохраните в файл res.jpg.
Используйте библиотеку PIL и коллекцию Image, спасибо.
Лучший ответ
ХА! Первогодки до PILLOW дошли уже)
Василий ПетросянУченик (91) 3 года назад
а ты от туда что-ли? ВАУ!!
Sarah LightBourne Мастер (2226) Второй год
Василий ПетросянУченик (91) 3 года назад
спасибо огромное, вы святой человек.Sarah LightBourne Мастер (2226) Если нужна будет помощь с задачами из яндекса, то могу телегу кинуть свою. У меня почти всё решено, а делать нечего
Vlad ComolliГуру (2654) 3 года назад
А что за ресурс?Sarah LightBourne Мастер (2226) Яндекс. Лицей. Там записываться и проходить собеседования нужно, чтобы получить доступ к LMS
Вертикальное отражение Python
В файле image.jpg лежит изображение. Зеркально отразите его относительно центральной вертикальной оси. Для этого напишите функцию mirror(), в которой прочитайте изображение из файла image.jpg, преобразуйте его и сохраните в файл res.jpg.
Используйте библиотеку PIL, и коллекцию Image. спасибо большое.
Голосование за лучший ответ
from PIL import Image
def mirror():
image = Image.open(«image.jpg»)
image = image.transpose(Image.FLIP_LEFT_RIGHT)
image.save(‘res.jpg’)Как работать с изображениями. Модули image и transform
Для фотореалистичных изображений лучше всего использовать JPEG, т.к. незначительные потери практически не скажутся на визуальном восприятии, но изображение будет хорошо сжато. Для искусственных изображений с большим наличием однотонных областей (например, клип-арт) где четкость границ и однотонность заливки имеет первостепенное значение, лучше выбирать формат PNG. Кроме того, этот формат хранит альфа-канал для прозрачного фона (в JPEG такой возможности нет).
Программа ниже инициализирует Pygame и выводит в консоль значение функции get_extended():
import pygame pygame.init() W, H = 600, 400 sc = pygame.display.set_mode((600, 400)) pygame.display.set_caption("Изображения") pygame.display.set_icon(pygame.image.load("app.bmp")) clock = pygame.time.Clock() FPS = 60 WHITE = (255, 255, 255) RED = (255, 0, 0) YELLOW = (239, 228, 176) print( pygame.image.get_extended() ) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() clock.tick(FPS)
Как видите, в данном случае Pygame возвращает 1, значит, можно использовать форматы PNG и JPEG. Теперь загрузим в программе изображение машинки:
car_surf = pygame.image.load("images/car.bmp")
Здесь используется функция load(), в которой указывается путь к изображению (относительно исполняемого файла на Питоне) и на выходе она формирует поверхность с изображением машинки. Далее, мы можем отобразить содержимое этой поверхности уже знакомым нам способом:
car_rect = car_surf.get_rect(center=(W//2, H//2)) sc.blit(car_surf, car_rect) pygame.display.update()

После выполнения программы увидим в центре окна изображение машины: Выглядит не очень. Добавим фон в виде изображения песка:
bg_surf = pygame.image.load("images/sand.jpg") sc.blit(bg_surf, (0, 0))
Стало лучше, но белый фон у машинки явно выделяется на фоне песка. Давайте укажем Pygame, что белый цвет следует воспринимать как прозрачный:
car_surf.set_colorkey((255, 255, 255))
Теперь намного лучше. Однако, если имеется файл с альфа-каналом (прозрачным фоном), то оно будет сразу отображаться нужным образом:
finish_surf = pygame.image.load("images/finish.png") sc.blit(finish_surf, (0, 0))
Следующий важный момент, особенно при разработке динамических игр, перевод пикселей загруженных изображений в формат пикселей главной поверхности:
car_surf = pygame.image.load("images/car.bmp").convert() finish_surf = pygame.image.load("images/finish.png").convert_alpha() bg_surf = pygame.image.load("images/sand.jpg").convert()
В этом случае, перерисовка поверхностей будет выполняться быстрее. Причем, обратите внимание, изображение в формате PNG с альфа-каналом преобразуется методом convert_alpha(), а не convert(). Вообще, эти строчки равносильны следующей операции:
car_surf = pygame.image.load("images/car.bmp") car_surf = car_surf.convert()
То есть, методы convert() и convert_alpha() – это методы класса Surface, которые возвращают новую поверхность с измененным представлением пикселей. При этом прежняя поверхность остается без изменений. Например, если переписать последнюю строчку вот так:
car_surf2 = car_surf.convert()
то пиксели car_surf2 будут приведены к формату главной поверхности, а пиксели car_surf останутся прежними – без изменений.
Трансформация поверхностей
Предположим, что мы теперь хотели бы уменьшить масштаб изображения фона, чтобы песок был более мелкий. Это можно сделать с помощью модуля pygame.transform содержащий различные функции трансформации поверхностей. Подробное их описание можно посмотреть на странице официальной документации: https://www.pygame.org/docs/ref/transform.html Итак, мы воспользуемся функцией: pygame.transform.scale(Surface, (width, height), DestSurface = None) -> Surface Здесь первый параметр – преобразуемая поверхность; (width, height) – ее новые значения ширины и высоты. В нашей программе вызовем эту функцию так:
bg_surf = pygame.transform.scale(bg_surf, (bg_surf.get_width()//3, bg_surf.get_height()//3))
Мы здесь уменьшаем размеры bg_surf в три раза по обеим координатам. Теперь, при отображении песок выглядит более мелким. Давайте теперь сделаем так, чтобы машинка перемещалась при нажатии на курсорные клавиши. Для начала мы сформируем изображения машинки при движении вверх, влево, вправо и вниз:
car_up = car_surf car_down = pygame.transform.flip(car_surf, 0, 1) car_left = pygame.transform.rotate(car_surf, 90) car_right = pygame.transform.rotate(car_surf, -90)
Далее, определим переменные для хранения текущего вида машинки и ее скорости:
car = car_up speed = 5
А внутри главного цикла будем выполнять перерисовку главного окна с текущим видом и положением машинки:
while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() bt = pygame.key.get_pressed() if bt[pygame.K_LEFT]: car = car_left car_rect.x -= speed if car_rect.x 0: car_rect.x = 0 elif bt[pygame.K_RIGHT]: car = car_right car_rect.x += speed if car_rect.x > W-car_rect.height: car_rect.x = W-car_rect.height elif bt[pygame.K_UP]: car = car_up car_rect.y -= speed if car_rect.y 0: car_rect.y = 0 elif bt[pygame.K_DOWN]: car = car_down car_rect.y += speed if car_rect.y > H-car_rect.height: car_rect.y = H-car_rect.height sc.blit(bg_surf, (0, 0)) sc.blit(finish_surf, (0, 0)) sc.blit(car, car_rect) pygame.display.update() clock.tick(FPS)
- pygame.image – загрузка/сохранение изображений;
- pygame.transform – трансформация поверхностей.