Surface

表示图像的pygame对象

pygame.Surface((width, height), flags=0, depth=0, masks=None): return Surface
pygame.Surface((width, height), flags=0, Surface): return Surface

pygame里的Surface是用来表示图像的对象。Surface有一定的大小和像素格式。如果是8bit像素格式的Surface,它还会用一个调色板映射到24比特颜色。

调用pygame.Surface可以创建表示图像的新对象。Surface会整个全是黑的。唯一需要指定的参数是大小。如果不指定其他参数,Surface的像素格式会与display Surface的像素格式尽量一致。

像素格式可以通过指定像素深度或者已有的Surface来控制。flags标志位参数是其他一些Surface选项的集合,你可以指定如下的标志

这些参数都仅仅是一个请求,在实际中可能并不能实现。

高级用户可以组合一组颜色屏蔽位,masks是4个整数的集合,表示像素里的哪个位用来表示一种颜色。一般的Surface不需要masks参数。

Surface可以有一些额外的属性,比如alpha平面、透明色、源矩形剪切。这些功能主要影响一个Surface如何被blit到其它的Surface。如果可能的话,blit函数会尝试使用硬件加速,否则就会使用优化的软件blit方法。

pygame支持三种类型的透明:透明色(colorkey),Surface alpha和每像素alpha。Surface alpha可以和透明色(colorkey)混合使用,但是有像素alpha的图像不能够使用其它模式。透明色(colorkey)让一种颜色值透明。任何和这个颜色相同的像素都不会被画出来。Surface alpha值是单独一个值用来改变整个图像的透明度。Surface alpha值是255表示不透明,值是0表示全透明。

而每像素alpha是不一样的,它为每个像素保存了一个透明值。这种方法允许精确的控制透明效果,但是这种方法也是最慢的。每像素alpha不能和其它方法混用。

Surface支持对单个像素的访问。访问硬件surface的像素是比较慢的,推荐不要这样做。像素可以由get_at()和set_at()函数访问。用这些函数做一些简单的操作是很好的,但是做比较复杂的像素操作就比较慢了。如果你打算做很多像素级的工作,你最好使用pygame.surfarray模块,它可以把surface像多维数组一样使用(而且比较快)。

任何直接访问Surface的像素数据的函数都要求先锁定(lock())。这些函数可以自动调用lock()和unlock()完成加锁和解锁。但是如果一个函数被调用很多次,那么就会有很多多余的加锁和解锁操作。最好是在多次使用这个函数之前,手动锁定Surface,并在结束时手动解锁。所有的需要解锁的函数的文档里面都会这样说。记住,只在需要的时候才锁住Surface。

Surface的数据在内部是表示成一个数字,包含所有的颜色。使用Surface.map_rgb和Surface.unmap_rgb来在独立的红绿蓝值和Surface的内部表示值之间的转换。

一个Surface可以引用另一个Surface的一部分。这通过Surface.subsurface函数创建。改变任何一个Surface都会影响其它的Surface。

每个Surface包含一个剪切区域。默认情况下,剪切区域是整个Surface。如果改变了剪切区域,所有的画图操作都会限制在一个比较小的范围之内。

1. Surface.blit

把一个图像画到另一个上面

Surface.blit(source, dest, area=None, special_flags = 0): return Rect

把源Surface画到这个Surface上。画的位置可以由dest参数指定。dest可以是一对坐标值,表示源Surface的左上角在这个Surface上的坐标。dest也可以是一个矩形,矩形的左上角作为blit的位置,而矩形的大小不影响blit。

有一个可选的area矩形参数,可以用来指定只画源Surface的一部分。

一个可选的special_flags参数,可以是BLEND_ADD、BLEND_SUB、BLEND_MULT、BLEND_MIN、BLEND_MAX。将来也可能有其它特殊标记添加进来。

返回的矩形表示受影响的像素的区域,不包括目标Surface以外的像素,也不包括剪切区域以外的像素。

如果blit到一个8位的Surface上,像素的alpha值会被忽略。

special_flags是在pygame 1.8中新增的。

2. Surface.convert

改变图像的像素格式

Surface.convert(Surface): return Surface
Surface.convert(depth, flags=0): return Surface
Surface.convert(masks, flags=0): return Surface
Surface.convert(): return Surface

创建一个像素格式不一样的新的Surface。新的像素格式可以由现存其它Surface确定,也可以由depth,flags或者masks决定。这些参数和pygame.Surface的参数类似。

如果没有参数,新的Surface会和display Surface的像素格式一样。这是画图最快的格式。转换所有需要多次blit的Surface是一个好主意。

转换出来的Surface不会有像素alpha。如果原来的Surface里面有,他们会被去掉。参看Surface.convert_alpha来保留或者创建每像素alpha。

3. Surface.copy

创建一个Surface的拷贝

Surface.copy(): return Surface

创建一个Surface的复制品。新创建的Surface和原来的Surface有相同的像素格式、调色板和透明设置。

4. Surface.fill

用一个颜色填充Surface

Surface.fill(color, rect=None): return Rect

用一种颜色填充Surface。如果没有给定rect参数,整个Surface会被填充。rect参数会限制备填充的区域。填充区域同样受到Surface的剪切区域的影响。

颜色参数可以是RGB序列或者是颜色索引值。

这个函数会返回受影响的Surface区域。

5. Surface.set_colorkey

设置透明色colorkey

Surface.set_colorkey(Color, flags=0): return None
Surface.set_colorkey(None): return None

设置Surface的透明色。当把这个Surface blit到令一个Surface时候,和这个透明色颜色相同的像素会变成透明。color参数可以是RGB颜色或者是一个映射的整数。如果传送的是None,则Surface会没有透明色。

如果是有每像素透明的Surface,透明色会被忽略。透明色可以和Surface alpha混合使用。

可选的flags参数可以是pygame.RLEACCEL,用来在没有加速的时候提供更好的性能。设置了RLEACCEL的Surface作为源Surface blit更快,但是修改Surface的内容会更慢。

6. Surface.get_at

获得特定像素点的颜色值

Surface.get_at((x, y)): return Color

返回指定像素的RGBA颜色值。如果Surface没有每像素alpha,alpha值总是255(不透明)。如果像素位置在Surface的区域以外,会引发一个IndexError异常。

在游戏和实时模拟中,一次取得和设置一个像素是很慢的。

这个函数会根据需要临时加锁和解锁Surface。

7. Surface.set_at

设置特定像素点的颜色值

Surface.set_at((x, y), Color): return None

为一个像素设置RGBA或者映射的整数颜色值。如果Surface没有每像素alpha,alpha值会被忽略。对Surface区域之外或者剪切区域之外的像素设置颜色不会有任何效果。

在游戏和实时模拟中,一次取得和设置一个像素是很慢的。

这个函数会根据需要临时加锁和解锁Surface。

8. Surface.set_clip

设置Surface的剪切区域

Surface.set_clip(rect): return None
Surface.set_clip(None): return None

每个Surface都有一个剪切区域。这个区域是个矩形,表示只有在这个矩形内的像素可以被修改。如果指定None作为矩形区域,则整个Surface都可以修改。

剪切区域总是在Surface本身的区域只内的。如果剪切区域比Surface的区域大,则会自动缩小到Surface区域之内。

9. Surface.get_clip

获得Surface的当前剪切区域

Surface.get_clip(): return Rect

返回Surface的当前剪切区域。一个Surface总是返回一个有效的矩形,不会超过图像的边界范围。如果Surface设置了None作为剪切区域,则Surface会返回整个Surface的区域。

10. Surface.get_size

获得Surface的大小

Surface.get_size(): return (width, height)

返回Surface的像素高度和宽度

11. Surface.get_width

获得Surface的宽度

Surface.get_width(): return width

返回Surface的像素宽度

12. Surface.get_height

获得Surface的高度

Surface.get_height(): return height

返回Surface的像素高度

The end

pygame.Surface (2008-02-23 15:35:50由localhost编辑)

ch3n2k.com | Copyright (c) 2004-2020 czk.