Pygame как изменить размер картинки

In this article we are going to see how to Rotate and Scale the image. Image Scaling refers to the resizing of the original image and Image Rotation refers to the turning of an image with some angle. Rotations in the coordinate plane are counterclockwise. Let s proceed with the methods

Improve Article

Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    In this article, we are going to see how to Rotate and Scale the image. Image Scaling refers to the resizing of the original image and Image Rotation refers to the turning of an image with some angle. Rotations in the coordinate plane are counterclockwise. Let’s proceed with the methods used and the complete code to perform these tasks.

    Scaling the Image

    To scale the image we use the pygame.transform.scale(image, DEFAULT_IMAGE_SIZE) method where we pass the image that we are going to scale and the default image size that we will set manually according to our need. 

    Example:

    Image Used:

    Python3

    import pygame

    pygame.init()

    size = width,height = 600, 600

    screen = pygame.display.set_mode(size)

    clock = pygame.time.Clock()

    image = pygame.image.load('gfg.png')

    DEFAULT_IMAGE_SIZE = (200, 200)

    image = pygame.transform.scale(image, DEFAULT_IMAGE_SIZE)

    DEFAULT_IMAGE_POSITION = (200,200)

    running = False

    while not running:

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                running = True

        screen.fill((0, 0, 0))

        screen.blit(image, DEFAULT_IMAGE_POSITION)

        pygame.display.flip()

        clock.tick(30)

    Output:

    Rotating the Image

    To rotate the image we use the pygame.transform.rotate(image, degree) method where we pass the image that we are going to rotate and the degree by which rotation is to be done. 

    Example:

    Python3

    import pygame

    pygame.init()

    size = width,height = 600, 600

    screen = pygame.display.set_mode(size)

    clock = pygame.time.Clock()

    image = pygame.image.load('gfg.png')

    DEFAULT_IMAGE_SIZE = (200, 200)

    image = pygame.transform.rotate(image, 180)

    DEFAULT_IMAGE_POSITION = (200,200)

    running = False

    while not running:

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                running = True

        screen.fill((0, 0, 0))

        screen.blit(image, DEFAULT_IMAGE_POSITION)

        pygame.display.flip()

        clock.tick(30)

    Output:

    Rotating and Scaling the Image

    Let us see how to perform the Scaling and Rotation of an image given.  We will set the default image size that is agreeable and the default image position where we want to see our image on the window screen. The same methods that are explained above will be used for scaling and rotation the image. 

    Example:

    Python3

    import pygame

    pygame.init()

    size = width,height = 600, 600

    screen = pygame.display.set_mode(size)

    clock = pygame.time.Clock()

    image = pygame.image.load('gfg.png')

    DEFAULT_IMAGE_SIZE = (200, 200)

    image = pygame.transform.scale(image, DEFAULT_IMAGE_SIZE)

    image = pygame.transform.rotate(image, 90)

    DEFAULT_IMAGE_POSITION = (200,200)

    running = False

    while not running:

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                running = True

        screen.fill((0, 0, 0))

        screen.blit(image, DEFAULT_IMAGE_POSITION)

        pygame.display.flip()

        clock.tick(30)

    Output:

    Improve Article

    Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    In this article, we are going to see how to Rotate and Scale the image. Image Scaling refers to the resizing of the original image and Image Rotation refers to the turning of an image with some angle. Rotations in the coordinate plane are counterclockwise. Let’s proceed with the methods used and the complete code to perform these tasks.

    Scaling the Image

    To scale the image we use the pygame.transform.scale(image, DEFAULT_IMAGE_SIZE) method where we pass the image that we are going to scale and the default image size that we will set manually according to our need. 

    Example:

    Image Used:

    Python3

    import pygame

    pygame.init()

    size = width,height = 600, 600

    screen = pygame.display.set_mode(size)

    clock = pygame.time.Clock()

    image = pygame.image.load('gfg.png')

    DEFAULT_IMAGE_SIZE = (200, 200)

    image = pygame.transform.scale(image, DEFAULT_IMAGE_SIZE)

    DEFAULT_IMAGE_POSITION = (200,200)

    running = False

    while not running:

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                running = True

        screen.fill((0, 0, 0))

        screen.blit(image, DEFAULT_IMAGE_POSITION)

        pygame.display.flip()

        clock.tick(30)

    Output:

    Rotating the Image

    To rotate the image we use the pygame.transform.rotate(image, degree) method where we pass the image that we are going to rotate and the degree by which rotation is to be done. 

    Example:

    Python3

    import pygame

    pygame.init()

    size = width,height = 600, 600

    screen = pygame.display.set_mode(size)

    clock = pygame.time.Clock()

    image = pygame.image.load('gfg.png')

    DEFAULT_IMAGE_SIZE = (200, 200)

    image = pygame.transform.rotate(image, 180)

    DEFAULT_IMAGE_POSITION = (200,200)

    running = False

    while not running:

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                running = True

        screen.fill((0, 0, 0))

        screen.blit(image, DEFAULT_IMAGE_POSITION)

        pygame.display.flip()

        clock.tick(30)

    Output:

    Rotating and Scaling the Image

    Let us see how to perform the Scaling and Rotation of an image given.  We will set the default image size that is agreeable and the default image position where we want to see our image on the window screen. The same methods that are explained above will be used for scaling and rotation the image. 

    Example:

    Python3

    import pygame

    pygame.init()

    size = width,height = 600, 600

    screen = pygame.display.set_mode(size)

    clock = pygame.time.Clock()

    image = pygame.image.load('gfg.png')

    DEFAULT_IMAGE_SIZE = (200, 200)

    image = pygame.transform.scale(image, DEFAULT_IMAGE_SIZE)

    image = pygame.transform.rotate(image, 90)

    DEFAULT_IMAGE_POSITION = (200,200)

    running = False

    while not running:

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                running = True

        screen.fill((0, 0, 0))

        screen.blit(image, DEFAULT_IMAGE_POSITION)

        pygame.display.flip()

        clock.tick(30)

    Output:

    In this Pygame tutorial we will explore how to “Resize” an Image in Pygame. There are several re-sizing and scaling functions in Pygame that we can use to resize images, each with it’s own unique twist. Let’s begin exploring the right away!

    Before we begin resizing an image however, we first need to load it into our Pygame application. This can be done using the image.load() function as shown below.

    image = pygame.image.load("D:ProgramspygamePlayer.png")
    

    Now that we have our image object, let’s explore how we can change it’s dimensions.


    We will be using the following image for our tutorial.

    resize an image in Pygame?

    Before we begin resizing an image, it’s a good idea to acquire it’s dimensions before hand. We can do this using the get_rect() method, which returns a Rect object with width and height attributes.

    width = image.get_rect().width
    height = image.get_rect().height
    

    Now that we have the width and the height, resizing becomes easier. This is because we can simply “scale” the image using it’s base dimensions.

    For example, if we want to double the size of the image, all we have to do is multiply the width and height by 2 and pass these as parameters to the pygame.transform.scale() function.

    image = pygame.transform.scale(image, (width*2, height*2))
    

    It is important to note that these functions are not “in-place” and do not modify the image object directly. Instead they will return a new surface object which we can either pass into a new variable or update the old one.

    Here is the complete version with all the supporting code:

    import pygame
    import sys
    
    pygame.init()
    screen = pygame.display.set_mode((400, 300))
    
    image = pygame.image.load("D:ProgramspygamePlayer.png")
    width = image.get_rect().width
    height = image.get_rect().height
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
    
        image = pygame.transform.scale(image, (width*2, height*2))
        
        screen.blit(image, (180, 100))
        pygame.display.update()
    

    Here we can see the size of image has doubled.

    Now let’s try the reverse. Let us scale it down to 1/2 of it’s size. It is important to pass only integers to the scale() function, hence we wrapped the values in the int() function.

    image = pygame.transform.scale(image, (int(width*0.5), int(height*0.5)))
    

    We can also pass in any values of our own into the second parameter of scale(). We may wish to do this with images where aren’t too worried about maintaining the original aspect ratio.

    image = pygame.transform.scale(image, (60, 100))
    

    Scaling with smoothscale()

    Another function that we can use for re-sizing is pygame.transform.smoothscale(). This function is almost identical to pygame.transform.scale(), but with one difference in how it works.

    Normally when you scale images up, this can result in a rather “jagged” image as the pixels become more clear. The smoothscale() function minimizes this problem by “blurring” the edges of the image to give it a smoother look.

    The syntax otherwise remains the exact same.

    image = pygame.transform.smoothscale(image, (width*2, height*2))
    

    This marks the end of the How to resize an image in Pygame Tutorial. Any suggestions or contributions for CodersLegacy are more than welcome. Questions regarding the tutorial content can be asked in the comments section below.

    • Pygame
    • Что такое Pygame? Каркас приложения, FPS
    • Рисование графических примитивов
    • Как обрабатывать события от клавиатуры
    • Как обрабатывать события от мыши
    • Создание поверхностей (Surface), их анимация, метод blit
    • Класс Rect. Его роль, свойства и методы
    • Как рисовать текст различными шрифтами
    • Как работать с изображениями. Модули image и transform
    • Что такое спрайты и как с ними работать
    • Как делать контроль столкновений
    • Добавляем звук в игровой процесс. Модули mixer и music
    • Главная
    • Модули
    • Pygame

    Ссылка на проект занятия (lesson 8.car_move.zip): https://github.com/selfedu-rus/pygame

    На этом занятии
    мы с вами узнаем как использовать изображения в библиотеке Pygame. Здесь сразу
    следует знать одну вещь: родной формат графических данных для Pygame – это

    bmp (от
    англ. Bitmap Picture)

    то есть, не
    сжатые наборы пикселей изображения. Такие графические файлы занимают много
    места по сравнению с другими распространенными форматами:

    • PNG (расширение png) – используется
      сжатие без потерь с использованием алгоритмов ДИКМ и LZW;

    • JPEG (расширение jpg) – используется
      сжатие с потерями (алгоритм ДКП – аналог Фурье-преобразования с косинусными
      гармониками).

    Существуют и
    другие форматы представления изображений, но они применяются гораздо реже, чем PNG или JPEG.

    Как же нам
    понять: какой формат данных выбирать? В действительности, все просто.
    Во-первых, нужно узнать: поддерживает ли Pygame на текущем
    устройстве какие-либо форматы, кроме BMP. Для этого следует выполнить
    функцию:

    pygame.image.get_extended()

    и если она
    вернет значение True (то есть 1), то в программе можно использовать PNG, JPEG, GIF и другие
    известные форматы. А, иначе, только BMP. Далее, при выборе между PNG и JPEG руководствуются
    следующим правилом:

    Для
    фотореалистичных изображений лучше всего использовать 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)

    Далее, определим
    переменные для хранения текущего вида машинки и ее скорости:

    А внутри
    главного цикла будем выполнять перерисовку главного окна с текущим видом и
    положением машинки:

    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)

    Смотрите, мы
    здесь проверяем: нажата ли какая-либо курсорная клавиша, и если срабатывает
    одно из условий, то переменная car ссылается на нужное изображение машинки
    и происходит изменение ее текущих координат на величину скорости. Далее,
    выполняется перерисовка главного окна и мы видим машинку с новым положением.
    Так происходит ее перемещение в пределах клиентского окна приложения.

    Фактически мы с
    вами рассмотрели основы работы с изображениями в Pygame с помощью двух
    модулей:

    • pygame.image –
      загрузка/сохранение изображений;

    • pygame.transform
      – трансформация
      поверхностей.

    Эти модули
    содержат множество полезных функций, с которыми подробнее можно ознакомиться на
    страницах документации:

    https://www.pygame.org/docs/ref/transform.html

    https://www.pygame.org/docs/ref/image.html

    Использование
    функций этих модулей достаточно просто и очевидно, поэтому нет смысла подробно
    о них говорить. Все делается по аналогии с рассмотренными на этом занятии.

    Видео по теме

    • Предыдущая
    • Следующая

    Понравилась статья? Поделить с друзьями:
  • Pygame error video system not initialized как исправить
  • Putty выдает ошибку network error connection refused
  • Pygame error unknown wave data format
  • Putty x11 proxy unable to connect to forwarded x server network error connection refused
  • Putty ubuntu network error connection refused