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 文件中找到