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)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容