一、介绍
用于改变surface
的pygame
模块
二、函数方法
项目 | 具体 |
---|---|
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)