pygame.Surface-图像
Pygame 支持三种透明度类型:colorkeys,surface alphas 和 pixel alphas(温馨提示:colorkeys 是指设置图像中的某个颜色值为透明,surface alphas 是调整整个图像的透明度,pixel alphas 则是独立设置图像中每一个像素的透明度)。surface alphas 可以和 colorkeys 混合使用,而 pixel alphas 不能和其他两个混合。
温馨提示:
colorkeys 是设置图像中的某个颜色值为透明(任何像素的颜色值只要跟 colorkeys 的值相同即被设置为透明);
surface alphas 是调整整个图像的透明度,范围是 0 ~ 255(0 表示完全透明,255 表示完全不透明);
pixel alphas 是为图像中的每个像素设置一个独立的值,用于存放该像素的透明度。这是最精确的透明度设置,但也是最慢的
import pygame pygame.init() screen = pygame.display.set_mode((960, 600)) pygame.display.set_caption("图像") tu=pygame.Surface((150, 150), flags=0, depth=32) #创建pygame.Surface图像对象--默认全黑色 #参数1:宽和高--默认屏幕大小 #参数2:HWSURFACE 将创建出来的 Surface 对象存放于显存中 # SRCALPHA 每个像素包含一个 alpha 通道---黑色透明,这个选项的使用需要第三个参数为32 #参数3:像素格式可以通过传递 depth 参数或一个已存在的 Surface 对象来控制 #参数4--masks:高级用法可以结合 masks 和 depth 参数,masks 是由 4 个整数组(温馨提示:(R, G, B, A)),将于每个像素的颜色进行按位与计算。通常,Surface 对象不需要 masks 参数 background = pygame.image.load('2.jpg') #载入图像 ##返回值类型是pygame.Surface的图像对象 yundong = pygame.image.load('1.png') rect1=pygame.Rect(0,0,10,10) rect2=pygame.Rect(0,0,100,100) #aa=background.blit(yundong,rect1) #将yundong对象画在background对象之上 aa=background.blit(yundong,(100,50),rect2) #返回值是一个pygame.Rect对象,表示实际绘制的矩形区域 #参数2:如果是个矩形对象,获取前两个属性作为画图的起点,跟后两个属性没有关系;也可以直接是起点坐标 #语句执行后,在内存中background图片上已经有yundong图片了 #参数3--可选参数:background上的绘图区域,其它区域不绘图 #参数4--可选参数:可选参数 special_flags 是 Pygame 1.8.0 新增的内容,用于指定混合的模式:BLEND_ADD,BLEND_SUB,BLEND_MULT,BLEND_MIN,BLEND_MAX;1.8.1 增加:BLEND_RGBA_ADD,BLEND_RGBA_SUB,BLEND_RGBA_MULT,BLEND_RGBA_MIN,BLEND_RGBA_MAX,BLEND_RGB_ADD,BLEND_RGB_SUB, BLEND_RGB_MULT,BLEND_RGB_MIN,BLEND_RGB_MAX;将来还可能添加更多新的标志 bb=background.convert() #创建一个与background相同的图片--修改图像(Surface 对象)为像素格式
#注意:只有修改后才是(RGB)格式,否则是(BGR)格式
cc=background.convert(yundong) #改图像的像素格式后能加快显示 #convert(depth, flags=0) -> Surface #convert(masks, flags=0) -> Surface dd=background.convert_alpha() #修改图像(Surface 对象)为像素格式,包含 alpha 通道
#注意:只有修改后才是(RGBA)格式,否则是(BGR)格式
ee=background.copy() #复制图像 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() screen.blit(ee, (0, 0)) pygame.display.update()
self.image = self.master_image.subsurface(rect) #从self.master_image图像中根据指定的区域rect返回新图像self.image
import pygame pygame.init() screen = pygame.display.set_mode((960, 600)) pygame.display.set_caption("图像") background = pygame.image.load('2.jpg') aa=background.fill((0,0,255), rect=(100,100,100,50), special_flags=0) #使用纯色填充 Surface 对象 #参数1:要填充的颜色。可以是 RGB 序列、RGBA 序列和映射的颜色索引号。如果使用 RGBA,则只有当 Surface 对象使用 pixel alphas,alpha 通道才会被填充 #参数2:填充的矩形范围--默认全部填充 #参数3--可选参数special_flags:是 Pygame 1.8.0 新增加的内容,用于指定混合的模式:BLEND_ADD,BLEND_SUB,BLEND_MULT,BLEND_MIN,BLEND_MAX;1.8.1 增加:BLEND_RGBA_ADD,BLEND_RGBA_SUB,BLEND_RGBA_MULT,BLEND_RGBA_MIN,BLEND_RGBA_MAX,BLEND_RGB_ADD,BLEND_RGB_SUB, BLEND_RGB_MULT,BLEND_RGB_MIN,BLEND_RGB_MAX;将来还可能添加更多新的标志 #返回值是一个 Rect 对象,表示实际绘制的矩形区域 background.scroll(dx=200, dy=100) #复制并移动图像 #dx 和 dy 参数分别控制水平和垂直位置的偏移量,值为正表示向右(向下),为负表示向左(向上)偏移 #没有被覆盖的范围则保留原来的像素值 #当 dx 和 dy 参数的值有一个大于 Surface 对象的尺寸,你将看不到移动的结果,但并不会出错 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() screen.blit(background, (0, 0)) pygame.display.update()
移动效果如图:
import pygame pygame.init() screen = pygame.display.set_mode((960, 600)) pygame.display.set_caption("图像") background = pygame.image.load('2.jpg') aa=background.fill((0,0,255), rect=(100,100,100,50), special_flags=0) background.set_colorkey((0,0,255)) #设置当前 Surface 对象的 colorkeys(透明色) #当绘制 Surface 对象时,将所有与 colorkeys 相同的颜色值绘制为透明。 Color 参数可以是 RGB 颜色,也可以是映射后的颜色索引号,如果传入 None,则取消 colorkeys 的设置 #如果 Surface 对象使用的是 pixel alphas 的方式设置透明度,那么 colorkeys 会被忽略(二者不能兼容);如果 Surface 对象使用 surface alphas 方式设置透明度,那么二者可以混合设置 #参数2--可选参数 flags:可以设置为 pygame.RLEACCEL,提供非加速显示的情况下更好的性能。修改一个设置了 RLEACCEL 的 Surface 对象会变慢一些,但绘制到其他 Surface 对象上时会更快 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() screen.blit(background, (0, 0)) pygame.display.update()
效果图:
import pygame pygame.init() screen = pygame.display.set_mode((960, 600)) pygame.display.set_caption("图像") background = pygame.image.load('2.jpg') aa=background.fill((0,0,255), rect=(100,100,100,50), special_flags=0) background.set_colorkey((0,0,255)) #设置当前 Surface 对象的 colorkeys(透明色) #当绘制 Surface 对象时,将所有与 colorkeys 相同的颜色值绘制为透明。 Color 参数可以是 RGB 颜色,也可以是映射后的颜色索引号,如果传入 None,则取消 colorkeys 的设置 #如果 Surface 对象使用的是 pixel alphas 的方式设置透明度,那么 colorkeys 会被忽略(二者不能兼容);如果 Surface 对象使用 surface alphas 方式设置透明度,那么二者可以混合设置 #参数2--可选参数 flags:可以设置为 pygame.RLEACCEL,提供非加速显示的情况下更好的性能。修改一个设置了 RLEACCEL 的 Surface 对象会变慢一些,但绘制到其他 Surface 对象上时会更快 bb=background.get_colorkey() #获取当前的 colorkeys(透明颜色值) #返回 Surface 对象当前 colorkeys 的颜色值,如果没有设置 colorkeys,则返回 None background.set_alpha(255) #设置整个图像的透明度 #参数1:value 参数的范围是 0 ~ 255,0 表示完全透明,255 表示完全不透明。如果传入 None,那么取消 surface alphas 设置 #如果 Surface 对象使用的是 pixel alphas 的方式设置透明度,那么 surface alphas 会被忽略(二者不能兼容);如果 Surface 对象使用 colorkeys 方式设置透明度,那么二者可以混合设置 #参数2--可选参数 flags :可以设置为 pygame.RLEACCEL,提供非加速显示的情况下更好的性能。修改一个设置了 RLEACCEL 的 Surface 对象会变慢一些,但绘制到其他 Surface 对象上时会更快 #注意:如果参数传入 None,pixel alphas 设置透明度的方式也会失效 bb=background.get_alpha() #获取整个图像的透明度 #返回 Surface 对象当前的整体透明度,如果没有设置 surface alpha,则返回 None print(bb) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() screen.blit(background, (0, 0)) pygame.display.update()
lock()
锁定 Surface 对象的内存使其可以进行像素访问。
lock() -> None
锁定 Surface 的像素数据使得其可以访问。对于加速的 Surface 对象,像素数据可能存储在显存中或以非线性压缩的形式存储。当一个 Surface 对象锁定了像素内存,常规软件就可以对它进行访问。对 Surface 对象进行读取或写入需要将其先锁定。
一般情况下,不应该将 Surface 对象长期保持锁定状态。因为一旦 Surface 对象被锁定,常常无法进行绘制或者导致 Pygame 无法对其进行管理。
另外,并不是所有的 Surface 对象都需要锁定后才能访问。mustlock() 方法可以检测一个 Surface 对象是否确实需要锁定。对于有必要进行锁定和解锁的 Surface 对象,该过程并不会导致任何性能下降。
所有的 Pygame 函数在需要的时候都会自动锁定和解锁 Surface 对象。如果有部分代码需要反复锁定和解锁 Surface 对象很多次,那么将锁定和解锁这对操作封装成独立的块也是很有用的(温馨提示:就像文件操作的打开和关闭)。
嵌套的锁定和解锁是安全的,Surface 对象会在最终的锁定被解除的时候解锁。
unlock() 解锁 Surface 对象的内存使其无法进行像素访问。
unlock() -> None
解锁已经锁定的 Surface 对象。解锁后的 Surface 对象才能再一次被绘制和被 Pygame 进行管理
mustlock() 检测该 Surface 对象是否需要被锁定
如果返回 True,说明该 Surface 对象需要被锁定才能访问像素数据。通常,纯软件的 Surface 对象不需要锁定。为了快捷安全地确认需要锁定的所有 Surface 对象,该方法是必要的
get_locked() 检测该 Surface 对象当前是否为锁定状态
当该 Surface 对象被锁定时(无论被重复锁定多少次),返回 True
get_locks() 返回该 Surface 对象的锁定
import pygame pygame.init() screen = pygame.display.set_mode((960, 600)) pygame.display.set_caption("图像") background = pygame.image.load('2.jpg') aa=background.fill((0,0,255), rect=(100,100,100,50), special_flags=0) bb=background.get_at((150,120)) #返回指定像素点的 RGBA 颜色值 #如果 Surface 对象的每个像素没有包含 alpha 通道,那么 alpha(A)的值将永远是 255(不透明)。如果指定像素的位置超出 Surface 对象的范围,将抛出 IndexError 异常 #(0, 0, 255, 255) bb=background.get_at_mapped((150,120)) #获取一个像素映射的颜色索引号 #返回指定像素点映射的颜色索引号。如果指定像素的位置超出 Surface 对象的范围,将抛出 IndexError 异常---16711680 print(bb) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() screen.blit(background, (0, 0)) pygame.display.update()
import pygame pygame.init() screen = pygame.display.set_mode((960, 600)) pygame.display.set_caption("图像") background = pygame.image.load('2.jpg').convert_alpha() for i in range(100): for j in range(100): background.set_at((100 + i, 50 + j), (255, 0, 0,100)) #设置一个像素的颜色值 #注意:图像必须经过convert_alpha修改后才有透明效果 #设置指定像素点的颜色值,Color 参数可以使 RGBA 值,也可以是映射的颜色索引号。如果 Surface 对象的每个像素没有包含 alpha 通道,那么 alpha(A)的值将被忽略。如果指定像素的位置超出 Surface 对象的范围或剪切区域,那么该设置并不会生效 bb=background.get_at((150,70)) #获取一个像素的颜色值 #(255, 0, 0, 100) #返回指定像素点的 RGBA 颜色值。如果 Surface 对象的每个像素没有包含 alpha 通道,那么 alpha(A)的值将永远是 255(不透明)。如果指定像素的位置超出 Surface 对象的范围,将抛出 IndexError 异常 print(bb) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() screen.blit(background, (0, 0)) pygame.display.update()
import pygame pygame.init() screen = pygame.display.set_mode((960, 600)) pygame.display.set_caption("图像") background = pygame.image.load('2.jpg').convert_alpha() bb=background.map_rgb((255,0,0,255)) #将一个 RGBA 颜色转换为映射的颜色值 #-65536 aa=background.unmap_rgb(-65536) #将一个映射的颜色值转换为 Color 对象 #(255, 0, 0, 255) print(bb,aa) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() screen.blit(background, (0, 0)) pygame.display.update()
import pygame pygame.init() screen = pygame.display.set_mode((960, 600)) pygame.display.set_caption("矩形") background = pygame.image.load('2.jpg').convert_alpha() rect = background.get_rect() print(rect) background.set_clip(0,0,50,50) #设置该 Surface 对象的当前剪切区域 #只有该矩形内的像素才可以被修改。如果传入None,表示剪切区域覆盖整个Surface对象 #剪切区域受限于 Surface 对象本身。如果剪切区域过大,那么将被缩小到匹配 Surface 对象的范围 for i in range(200): #只有(0,0,50,50)区域的像素被修改,其它区域没有被修改 for j in range(200): background.set_at((i, j), (255, 0, 0,100)) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() screen.blit(background, (0, 0)) pygame.display.update()
rect=background.get_clip() #获取该 Surface 对象的当前剪切区域 #返回该 Surface 对象的当前剪切区域,用一个 Rect 对象来描述。Surface 对象返回的限定矩形永远不会超出图像的边界 #如果该 Surface 对象没有设置剪切区域,那么将返回整个图像那么大的限定矩形
import pygame pygame.init() screen = pygame.display.set_mode((960, 600)) pygame.display.set_caption("矩形") background = pygame.image.load('2.jpg').convert_alpha() rect = pygame.Rect(0,0,500,500) sub=background.subsurface(rect) #根据父对象创建一个新的子 Surface 对象 #返回一个子 Surface 对象,它将与父对象共享所有的像素。修改子对象或父对象任一的像素均会影响到彼此,Surface 对象的信息像剪切区域,color keys 都是相同的。 #新的子对象将从它的父对象中继承调色板、color keys 和 alpha 通道的设置。 #存在多个子 Surface 对象以及子子 Surface 对象(subsubsurface)均是可以的。在显示模式不是硬件加速状态时,也是支持子 Surface 对象的 f=sub.get_parent() #获取子Sub对象的父对象 #返回父对象,如果不存在父对象,则返回 None rect1 = pygame.Rect(0,0,300,300) sub1=sub.subsurface(rect1) f1=sub1.get_parent() ff=sub1.get_abs_parent() #获取子sub1对象的顶层父对象 #返回子snb1对象的顶层父对象,如果不存在父对象,则返回该 Sub1对象本身(如果没有父对象,本身就是顶层父对象) rect2 = pygame.Rect(100,100,300,300) sub2=background.subsurface(rect2) y=sub2.get_offset() #获取子sub2对象在父对象中的偏移位置 #(100, 100) #获取子sub2对象在父对象中的偏移位置。如果该sub2对象不是子对象,则返回 (0, 0) y=sub1.get_abs_offset() #获取子sub1对象在顶层父对象中的偏移位置 #get_abs_offset() -> (x, y) #获取子sub1对象在顶层父对象中的偏移位置。如果该sub1对象不是子对象,则返回 (0, 0) y=sub1.get_size() #获取sub1对象的尺寸 #返回sub1对象的宽度和高度,以像素为单位 #(300, 300) w=sub1.get_width() #获取sub1对象的宽度--以像素为单位 h=sub1.get_height() #获取sub1对象的高度--以像素为单位 s=sub1.get_rect() #获取sub1对象的矩形区域 #<rect(0, 0, 300, 300)> x=sub1.get_bitsize() #获取sub1对象像素格式的位深度 #32 #返回该 Surface 对象中每个像素用多少位来表示。该值可能不会完全与每个像素所使用的字节数相同。例如一个 15 位深度的 Surface 对象依然需要 2 个字节来存放 x=sub1.get_bytesize() #获取 Surface 对象每个像素使用的字节数 print(x) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() screen.blit(sub2, (0, 0)) pygame.display.update()
x=sub1.get_flags() #获取 Surface 对象的附加标志
#返回当前 Surface 对象的特征。每个特征都是一个位掩码标志。典型标志有 HWSURFACE,RLEACCEL,SRCALPHA 和 SRCCOLORKEY
下边是一个相对比较全面的标志列表,全部标志可在 SDL_video.h 文件中找到