Spec-Zone.ru › Pygame
pygame.transform
модуль pygame для преобразования поверхностей

Преобразование поверхности — это операция, которая перемещает или изменяет размер пикселей. Все эти функции принимают поверхность для обработки и возвращают новую поверхность с результатами.

Некоторые преобразования считаются деструктивными. Это означает, что каждый раз, когда они выполняются, теряются данные пикселей. Типичные примеры этого — изменение размера и вращение. По этой причине лучше повторно преобразовать исходную поверхность, чем многократно преобразовывать изображение. (Например, предположим, что вы анимируете прыгающую пружину, которая расширяется и сжимается. Если вы будете применять изменения размера поочередно к предыдущим изображениям, вы потеряете детали. Вместо этого всегда начинайте с исходного изображения и масштабируйте его до нужного размера.)

Изменено в pygame 2.0.2: функции преобразования теперь поддерживают ключевые аргументы.

pygame.transform.flip()
отражение по вертикали и горизонтали
flip(surface, flip_x, flip_y) -> Surface

Это позволяет отразить поверхность по вертикали, горизонтали или по обеим осям. Аргументы flip_x и flip_y — булевы значения, которые управляют отражением по каждой оси. Отражение поверхности не разрушает её и возвращает новую поверхность с теми же размерами.

pygame.transform.scale()
изменение размера до нового разрешения
scale(surface, size, dest_surface=None) -> Surface

Изменяет размер поверхности до нового размера, заданного как (ширина, высота). Это быстрая операция изменения размера, которая не выполняет выборки результатов.

Можно использовать необязательную целевую поверхность вместо создания новой. Это быстрее, если вы хотите многократно изменять размер чего-либо. Однако целевая поверхность должна иметь тот же размер, что и переданный размер (ширина, высота). Также целевая поверхность должна иметь тот же формат.

pygame.transform.scale_by()
изменение размера до нового разрешения с использованием коэффициента(ов)
scale_by(surface, factor, dest_surface=None) -> Surface

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

Аналогично scale(), но масштабирование выполняется с помощью коэффициента, а не явного указания нового размера. Например, transform.scale_by(surf, 3) увеличит размер поверхности в обоих измерениях втрое. Допускается использование последовательности из двух чисел для задания отдельных коэффициентов масштабирования по осям X и Y. Например, transform.scale_by(surf, (2, 1)) удваивает ширину изображения, сохраняя при этом высоту неизменной.

Новая в pygame 2.1.3.

pygame.transform.rotate()
вращение изображения
rotate(surface, angle) -> Surface

Вращение против часовой стрелки без фильтрации. Аргумент angle представляет градусы и может быть любым значением с плавающей запятой. Отрицательные значения угла повернут изображение по часовой стрелке.

Если вращение не на 90 градусов, изображение будет увеличено, чтобы вместить новый размер. Если изображение имеет альфа-каналы, отформатированная область будет прозрачной. В противном случае pygame выберет цвет, соответствующий ключу цвета поверхности или значению левого верхнего пикселя.

pygame.transform.rotozoom()
фильтрованное масштабирование и вращение
rotozoom(surface, angle, scale) -> Surface

Это комбинированное преобразование масштабирования и вращения. Результирующая поверхность будет отфильтрованной 32-битной поверхностью. Аргумент scale — это число с плавающей точкой, которое умножит текущее разрешение. Аргумент angle — это число с плавающей точкой, представляющее градусы поворота против часовой стрелки. Отрицательный угол поворота повернёт изображение по часовой стрелке.

pygame.transform.scale2x()
специализированное удвоение изображения
scale2x(surface, dest_surface=None) -> Surface

Возвращает новое изображение, которое вдвое больше исходного. Оно использует алгоритм Scale2X AdvanceMAME, который выполняет «гладкое» масштабирование растровых графических изображений.

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

Можно использовать необязательную целевую поверхность вместо создания новой. Это быстрее, если вы хотите многократно изменять размер чего-либо. Однако целевая поверхность должна быть в два раза больше исходной поверхности, переданной в качестве аргумента. Также целевая поверхность должна иметь тот же формат.

pygame.transform.smoothscale()
гладкое изменение размера поверхности до произвольного размера
smoothscale(surface, size, dest_surface=None) -> Surface

Использует один из двух разных алгоритмов для масштабирования каждого измерения входной поверхности по мере необходимости. При уменьшении размера выходные пиксели — средние значения цветов, которые они охватывают. При увеличении размера используется билинейный фильтр. Для архитектур x86-64 и i686 включены оптимизированные MMX процедуры, которые будут работать намного быстрее, чем на других типах машин. Размер — это последовательность из 2 чисел для (ширина, высота). Эта функция работает только для поверхностей с глубиной цвета 24 или 32 бита. Если глубина бита входной поверхности меньше 24, будет выброшено исключение.

Новая в pygame 1.8.

pygame.transform.smoothscale_by()
изменение размера до нового разрешения с использованием коэффициента(ов)
smoothscale_by(surface, factor, dest_surface=None) -> Surface

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

Аналогично smoothscale(), но масштабирование выполняется с помощью коэффициента, а не явного указания нового размера. Например, transform.smoothscale_by(surf, 3) увеличит размер поверхности в обоих измерениях втрое. Допускается использование последовательности из двух чисел для задания отдельных коэффициентов масштабирования по осям X и Y. Например, transform.smoothscale_by(surf, (2, 1)) удваивает ширину изображения, сохраняя при этом высоту неизменной.

Новая в pygame 2.1.3.

pygame.transform.get_smoothscale_backend()
возвращает используемую версию фильтра smoothscale: 'GENERIC', 'MMX' или 'SSE'
get_smoothscale_backend() -> string

Показывает, использует ли smoothscale ускорение MMX или SSE. Если ускорение недоступно, возвращается "GENERIC". Для процессоров x86 уровень ускорения определяется во время выполнения.

Эта функция предназначена для тестирования и отладки pygame.

pygame.transform.set_smoothscale_backend()
установка версии фильтра smoothscale на одну из: 'GENERIC', 'MMX' или 'SSE'
set_smoothscale_backend(backend) -> None

Устанавливает ускорение smoothscale. Принимает строковый аргумент. Значение 'GENERIC' отключает ускорение. 'MMX' использует только инструкции MMX. 'SSE' также допускает расширения SSE. Если тип не распознается или не поддерживается текущим процессором, генерируется исключение ValueError.

Эта функция предназначена для тестирования и отладки pygame. Если smoothscale вызывает ошибку недействительной инструкции, это ошибка pygame/SDL, которую следует сообщить. Используйте эту функцию только как временное решение.

pygame.transform.chop()
получает копию изображения с удалённой внутренней областью
chop(surface, rect) -> Surface

Извлекает часть изображения. Все вертикальные и горизонтальные пиксели вокруг заданной области прямоугольника удаляются. Затем угловые области (диагональные по отношению к прямоугольнику) соединяются. (Исходное изображение при этом не изменяется.)

NOTE: Если вам нужна «вырезка», возвращающая часть изображения внутри прямоугольника, можно использовать blit с прямоугольником на новую поверхность или скопировать подповерхность.

pygame.transform.laplacian()
поиск границ на поверхности
laplacian(surface, dest_surface=None) -> Surface

Ищет границы на поверхности с использованием алгоритма Лапласа.

Новая в pygame 1.8.

pygame.transform.average_surfaces()
найти среднюю поверхность из множества поверхностей.
average_surfaces(surfaces, dest_surface=None, palette_colors=1) -> Surface

Принимает последовательность поверхностей и возвращает поверхность со средними цветами из каждой из поверхностей.

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

Обратите внимание, что эта функция в настоящее время не обрабатывает поверхности, использующие палитру, правильно.

Новая в pygame 1.8.

Новая в pygame 1.9: palette_colors аргумент

pygame.transform.average_color()
находит средний цвет поверхности
average_color(surface, rect=None, consider_alpha=False) -> Color

Находит средний цвет Surface или области Surface, заданной Rect, и возвращает его как Color. Если consider_alpha установлено в True, тогда учитывается альфа (удаляются черные артефакты).

Новая в pygame 2.1.2: consider_alpha аргумент

pygame.transform.grayscale()
преобразовать поверхность в оттенки серого
grayscale(surface, dest_surface=None) -> Surface

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

Можно передать необязательную целевую поверхность, что быстрее, чем создание новой поверхности. Эта целевая поверхность должна иметь такие же размеры (ширина, высота) и глубину, как исходная поверхность.

pygame.transform.threshold()
определяет, сколько пикселей на поверхности находятся в пределах порога от 'search_color' или 'search_surf'.
threshold(dest_surface, surface, search_color, threshold=(0,0,0,0), set_color=(0,0,0,0), set_behavior=1, search_surf=None, inverse_set=False) -> num_threshold_pixels

Эта универсальная функция может использоваться для поиска цветов в 'surf', близких к 'search_color' или к цветам на отдельной 'search_surf'.

Она также может использоваться для перевода пикселей в 'dest_surf', которые совпадают или не совпадают.

По умолчанию она устанавливает пиксели в 'dest_surf', где все пиксели, НЕ входящие в порог, изменяются на set_color. Если необязательно установить inverse_set в True, то пиксели, КОТОРЫЕ находятся в пределах порога, изменяются на set_color.

Если необязательная поверхность 'search_surf' указана, она используется для порогового значения вместо указанного 'set_color'. То есть, она будет находить каждый пиксель в 'surf', который находится в пределах 'threshold' от пикселя в тех же координатах 'search_surf'.

Параметры
  • dest_surf (pygame.Surface или None) -- Изменяемая поверхность. См. 'set_behavior'. Должно быть None, если подсчитывается (set_behavior равен 0).

  • surf (pygame.Surface) -- Поверхность, которую мы рассматриваем.

  • search_color (pygame.Color) -- Цвет, который мы ищем.

  • threshold (pygame.Color) -- В пределах этого расстояния от search_color (или search_surf). Можно использовать порог (r,g,b,a), где r,g,b могут иметь разные пороги. Таким образом, вы могли бы использовать порог r в 40 и порог синего в 2, если хотите.

  • set_color (pygame.Color или None) -- Цвет, который мы устанавливаем в dest_surf.

  • set_behavior (int) --

    • set_behavior=1 (по умолчанию). Пиксели в dest_surface будут изменены на 'set_color'.

    • set_behavior=0 мы не изменяем 'dest_surf', только считаем. Установите dest_surf=None.

    • set_behavior=2 пиксели, установленные в 'dest_surf', будут из 'surf'.

  • search_surf (pygame.Surface или None) --

    • search_surf=None (по умолчанию). Поиск по 'search_color' вместо этого.

    • search_surf=Surface. Смотрим на цвет в 'search_surf' вместо использования 'search_color'.

  • inverse_set (bool) --

    • False, по умолчанию. Пиксели вне порога изменяются.

    • True, Пиксели в пределах порога изменяются.

Тип возвращаемого значения

int

Возвращает

Количество пикселей, которые находятся в пределах 'threshold' в 'surf' по сравнению с 'search_color' или search_surf.

Примеры

См. тесты пороговых значений для получения примеров: https://github.com/pygame/pygame/blob/main/test/transform_test.py

def test_threshold_dest_surf_not_change(self):
        """the pixels within the threshold.

        All pixels not within threshold are changed to set_color.
        So there should be none changed in this test.
        """
        (w, h) = size = (32, 32)
        threshold = (20, 20, 20, 20)
        original_color = (25, 25, 25, 25)
        original_dest_color = (65, 65, 65, 55)
        threshold_color = (10, 10, 10, 10)
        set_color = (255, 10, 10, 10)

        surf = pygame.Surface(size, pygame.SRCALPHA, 32)
        dest_surf = pygame.Surface(size, pygame.SRCALPHA, 32)
        search_surf = pygame.Surface(size, pygame.SRCALPHA, 32)

        surf.fill(original_color)
        search_surf.fill(threshold_color)
        dest_surf.fill(original_dest_color)

        # set_behavior=1, set dest_surface from set_color.
        # all within threshold of third_surface, so no color is set.

        THRESHOLD_BEHAVIOR_FROM_SEARCH_COLOR = 1
        pixels_within_threshold = pygame.transform.threshold(
            dest_surface=dest_surf,
            surface=surf,
            search_color=None,
            threshold=threshold,
            set_color=set_color,
            set_behavior=THRESHOLD_BEHAVIOR_FROM_SEARCH_COLOR,
            search_surf=search_surf,
        )

        # # Return, of pixels within threshold is correct
        self.assertEqual(w * h, pixels_within_threshold)

        # # Size of dest surface is correct
        dest_rect = dest_surf.get_rect()
        dest_size = dest_rect.size
        self.assertEqual(size, dest_size)

        # The color is not the change_color specified for every pixel As all
        # pixels are within threshold

        for pt in test_utils.rect_area_pts(dest_rect):
            self.assertNotEqual(dest_surf.get_at(pt), set_color)
            self.assertEqual(dest_surf.get_at(pt), original_dest_color)

Новая в pygame 1.8.

Изменено в pygame 1.9.4: Исправлено множество ошибок и добавлены ключевые аргументы. Протестируйте свой код.




Изменить на GitHub

© Pygame Developers.
Licensed under the GNU LGPL License version 2.1.
https://www.pygame.org/docs/ref/transform.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API