py 第三十六天 Pygame2:transform

一、介绍

用于改变surfacepygame模块

二、函数方法

项目 具体
pygame.transform.flip 垂直和水平翻转
pygame.transform.scale 调整大小到新的分辨率
pygame.transform.rotate 旋转图像
pygame.transform.rotozoom 过滤的缩放和旋转
pygame.transform.scale2x 专门的图像倍增器
pygame.transform.smoothscale 平滑地将曲面缩放到任意大小
pygame.transform.get_smoothscale_backend 返回正在使用的 smoothscale 过滤器版本:'GENERIC','MMX' 或 'SSE'
pygame.transform.set_smoothscale_backend 将 smoothscale 过滤器版本设置为以下之一:'GENERIC','MMX' 或 'SSE'
pygame.transform.chop 获取移除的内部区域的图像副本
pygame.transform.laplacian 在 surface 中查找边
pygame.transform.average_surfaces 从许多 surface 中找到平均 surface 。
pygame.transform.average_color 查找 surface 的平均颜色
pygame.transform.threshold 查找表面中的哪些像素以及多少像 在 'search_color' 或 'search_surf' 的阈值内

surface 变换是移动像素或调整像素大小的操作。
所有这些函数都使用 Surface进行操作并返回带有结果的新 Surface
一些变换被认为是破坏性的。
这意味着每次执行它们都会丢失像素数据。

常见的例子是调整大小和旋转。
因此,重新转换原始 surface 比保持多次转换图像更好。
例如,假设正在为一个弹跳弹簧进行动画扩展和收缩。
如果将大小更改应用于前一个图像,则会丢失细节。
相反,始终从原始图像开始并缩放到所需大小。

三、函数详解

pygame.transform.flip()

垂直和水平翻转

flip(Surface, xbool, ybool) -> Surface

这可以通过垂直,水平或两者一起来翻转 Surface 。

翻转 Surface 是非破坏性的,并返回具有相同尺寸的新曲面。

pygame.transform.scale()

调整大小到新的分辨率

scale(Surface, (width, height), DestSurface = None) -> Surface

Surface 的大小调整为新分辨率。

这是一种快速扩展操作,不会对结果进行采样。

可以使用可选的目标 Surface,而不是创建新的目标 Surface

如果你想反复缩放某些东西,这会更快。

但是,目标必须与传入的 (width, height) 大小相同。

目标 Surface 也必须是相同的格式。

pygame.transform.rotate()

旋转图像

rotate(Surface, angle) -> Surface

未经过滤的逆时针旋转angle 参数表示角度,可以是任何浮点值。

负角度量将顺时针旋转。

除非以 90 度的增量旋转,否则图像将被填充得更大以保持新的尺寸。

如果图像具有像素 alpha,则填充区域将是透明的。

否则,pygame 将选择与 Surface 颜色键(colorkey)或左上角像素值匹配的颜色。

pygame.transform.rotozoom()

过滤的缩放和旋转

rotozoom(Surface, angle, scale) -> Surface

这是组合的缩放和旋转变换。

生成的 Surface将是一个过滤的 32 位 Surface

scale参数是一个浮点值将乘以当前分辨率

角度参数是一个浮点值,表示要旋转的逆时针度数

负旋转角度将顺时针旋转

pygame.transform.scale2x()

专门的图像倍增器

scale2x(Surface, DestSurface = None) -> Surface

这将返回一个原始尺寸的两倍的新图像。

它使用 AdvanceMAME Scale2X 算法,该算法可以实现"无瑕疵"的位图图形缩放。

这实际上只对纯色的简单图像产生影响。

在摄影和抗锯齿图像上,它看起来像一个普通的未过滤的尺度。

可以使用可选的目标 surface,而不是创建新的目标 surface 。

如果想反复缩放某些东西,这会更快。

但是,目标必须是传入的源 surface 大小的两倍。

目标 surface 也必须是相同的格式。

pygame.transform.smoothscale()

平滑地将曲面缩放到任意大小

smoothscale(Surface, (width, height), DestSurface = None) -> Surface

使用两种不同算法中的一种来根据需要缩放输入surface的每个维度。

对于收缩,输出像素是它们覆盖的颜色的面积平均值。

对于扩展,使用双线性滤波器。

对于 x86-64 和 i686 架构,包含优化的 MMX 程序,运行速度比其他机器类型快得多。

大小是(width, height)的 2 个数字序列。

此函数仅适用于 24 位或 32 位 surface 。

如果输入表面位深度小于 24,则抛出异常。

pygame 1.8 的新特性

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(type) -> None

设置 smoothscale 加速。

采用字符串参数。

'GENERIC'的值会关闭加速。

'MMX' 仅使用 MMX 指令。

'SSE' 也允许 SSE 扩展。

如果当前处理器无法识别或不支持类型,则会引发值错误。

该函数用于 pygame 测试和调试。

如果 smoothscale 导致无效的指令错误,那么应该报告 pygame/SDL 错误。

仅将此函数用作临时修复。

pygame.transform.chop()

获取移除的内部区域的图像副本

chop(Surface, rect) -> Surface

提取图像的一部分。

围绕给定矩形区域的所有垂直和水平像素都被移除。

然后将角落区域(与矩形对角线)放在一起。
(此操作不会更改原始图像)

注意:如果想要一个 "crop(裁剪)" 返回矩形内图像的一部分,可以使用矩形 blit 到新 surface 或复制子 surface 。

pygame.transform.laplacian()

在surface中查找边

laplacian(Surface, DestSurface = None) -> Surface

使用拉普拉斯算法查找曲面中的边。

pygame 1.8 的新特性

pygame.transform.average_surfaces()

从许多 surface 中找到平均 surface

average_surfaces(Surfaces, DestSurface = None, palette_colors = 1) -> Surface
采用一系列 surfaces 并返回具有每个 surface 的平均颜色的曲面。

palette_colors -如果为true,我们将平均调色板中的颜色,否则我们平均像素值。

如果 surfacec是灰度颜色而不是调色板颜色,则此选项非常有用。

注意,此函数目前不能正确使用 surface 处理调色板。

pygame.transform.average_color()

查找surface的平均颜色

average_color(Surface, Rect = None) -> Color

查找 surface 的平均颜色或由 Rect 指定的曲面区域,并将其作为颜色返回。

pygame.transform.threshold()

查找表面中的哪些像素以及多少像素在 'search_color' 或 'search_surf' 的阈值内。

threshold(dest_surf, surf, 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

这种多功能的函数可用于在 search_color 附近的surf中查找颜色,或在单独的 search_surf中接近颜色。

它还可用于将像素传输到匹配或不匹配的 dest_surf

默认情况下,它会在 dest_surf中设置像素,其中所有不在阈值范围内的像素都会更改为 set_color

如果inverse_set可选地设置为 True,则阈值内的像素将更改为 set_color

如果给出了可选的 search_surf 表面,则它用于阈值而不是指定的 set_color

也就是说,它将在search_surf的同一坐标下,在像素的 threshold内找到 surf 中的每个像素。

参数 含义
dest_surf(pygame.Surface 对象或 None) 正在改变的 surface 。请参阅 'set_behavior' 。如果正在计数(set_behavior为0),则应为 None
surf(pygame.Surface 对象) 正在看的表面
search_color(pygame.Colo r对象) 正在搜索的颜色
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,阈值内的像素会发生变化。

类型:return int

返回:与 'search_color' 或 search_surf 相比,'surf' 中 'threshold' 内的像素数

例子:

def test_threshold_dest_surf_not_change(self):
        """ 阈值里的像素

        不在阈值范围内的所有像素都更改为set_color。
                所以在这个测试中应该没有变化。
        """
        (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_color设置dest_surface。
         #all all在third_surface的阈值内,因此没有设置颜色。

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

        # # 返回阈值内的像素是正确的
        self.assertEqual(w*h, pixels_within_threshold)

        # # dest surface 的大小是正确的
        dest_rect = dest_surf.get_rect()
        dest_size = dest_rect.size
        self.assertEqual(size, dest_size)

                #颜色不是为每个像素指定的change_color
        #像素在阈值范围内
        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)

你可能感兴趣的:(py 第三十六天 Pygame2:transform)