Color 色彩物件使用說明
訂閱 480
Pygame 建立、變更色彩(Color 物件)影片示範 YouTube
Pygame 中的 Color 物件
Pygame 套件的Color物件可用於表示遊戲中的色彩,並包含一些用於計算色彩的方法,以下是其建構子。
Color(r, g, b, a=255)
Color(rgbvalue)
- r 參數
r參數是範圍從0到255的整數,表示色彩中的紅色。- g 參數
g參數是範圍從0到255的整數,表示色彩中的綠色。- b 參數
b參數是範圍從0到255的整數,表示色彩中的藍色。- a 參數
a參數是範圍從0到255的整數,表示色彩中的透明度,預設值為255(不透明)。- rgbvalue 參數
rgbvalue參數是一個包含色彩資訊的物件,他可以是字串,整數(可以書寫為容易理解的十六進位格式0xRRGGBBAA,其中RR表示紅色,GG表示綠色,BB表示藍色,AA表示透明度),Python 整數序列物件(依次包含表示紅色,綠色,藍色的整數,或包含表示紅色,綠色,藍色,透明度的整數),或另一個Color物件。如果
rgbvalue參數是一個字串,那麽該字串可以是命名色彩的名稱(至於命名色彩,你可以參考給出的連結),或形式類似於'#RRGGBBAA','#RRGGBB','0xRRGGBBAA','0xRRGGBB'(RR表示紅色,GG表示綠色,BB表示藍色,AA表示透明度)。
在下面的範例中,我們建立了一些色彩物件,並將他們繪製在了表面物件中。
# 匯入 Color 物件
from pygame import Color
# 建立不同的色彩
red1 = Color([255, 0, 0])
red2 = Color([255, 0, 0, 100])
green1 = Color('#00FF00')
green2 = Color('#00FF99')
blue = Color('blue')
# 建立遊戲視窗,使用色彩進行繪製,並等候 2 秒鐘
from pygame import display, draw, Surface, SRCALPHA
s = display.set_mode((800, 600))
# 建立表面,繪製矩形,填入色彩
area = Surface((400, 400), SRCALPHA)
draw.rect(area, red1, [0, 0, 100, 100])
draw.rect(area, red2, [0, 100, 100, 100])
draw.rect(area, green1, [100, 0, 100, 100])
draw.rect(area, green2, [100, 100, 100, 100])
draw.rect(area, blue, [200, 200, 100, 100])
s.blit(area, (0, 0))
display.flip()
import time
time.sleep(2)取得和設定色彩資訊
Color物件的變數r,g,b,a,可用於取得或設定色彩中的紅色,綠色,藍色以及透明度。
color.r
color.g
color.b
color.a
color.r = r
color.g = g
color.b = b
color.a = a
- r 值
r是範圍從0到255的整數,表示色彩中的紅色。- g 值
g是範圍從0到255的整數,表示色彩中的綠色。- b 值
b是範圍從0到255的整數,表示色彩中的藍色。- a 值
a是範圍從0到255的整數,表示色彩中的透明度,預設值為255(不透明)。
from pygame import Color
red = Color(255, 0, 0)
print(f'紅:{red.r} 綠:{red.g} 藍:{red.b} 透明度:{red.a}')
# 將色彩改為透明的
red.a = 0
print(f'透明度:{red.a}')紅:255 綠:0 藍:0 透明度:255
透明度:0Color物件的變數cmy,hsva,hsla,i1i2i3,可使用色彩格式 CMY,HSVA,HSLA,I1I2I3 來取得或設定色彩資訊。
color.cmy
color.hsva
color.hsla
color.i1i2i3
color.cmy = cmy
color.hsva = hsva
color.hsla = hsla
color.i1i2i3 = i1i2i3
- cmy 值
cmy是一個形式類似於(C,M,Y)的 Python 浮點數元組,其中C表示青色,M表示品紅,Y表示黃色,他們的取值範圍是0到1。- hsva 值
hsva是一個形式類似於(H,S,V,A)的 Python 浮點數元組,其中H表示色調,取值範圍是0到360,S表示飽和度,取值範圍是0到100,V表示明度,取值範圍是0到100,A表示透明度,取值範圍是0到100。- hsla 值
hsla是一個形式類似於(H,S,L,A)的 Python 浮點數元組,其中H,S,A所表示的含義和取值範圍與hsva相同,L表示亮度,取值範圍是0到100。這裏需要指出,雖然
hsla中的S與hsva中的S含義相同,但計算方式卻存在差異,因此同一個色彩在 HSVA 和 HSLA 格式中的飽和度不一定相同。- i1i2i3 值
i1i2i3是一個形式類似於(I1,I2,I3)的 Python 浮點數元組,其中I1取值範圍是0到1,I2取值範圍是-0.5到0.5,I3取值範圍是-0.5到0.5。
# 以 CMY 格式取得和設定色彩資訊
color1 = Color('#3399ff')
print(f'cmy:{color1.cmy} 紅:{color1.r} 綠:{color1.g} 藍:{color1.b}')
color1.cmy = (0.81, 0.4123, 0.0001)
print(f'cmy:{color1.cmy} 紅:{color1.r} 綠:{color1.g} 藍:{color1.b}')
# 顯示 HSVA,HSLA,I1I2I3 格式的色彩資訊
color2 = Color((200, 100, 50, 25))
print(f'hsva:{color2.hsva}')
print(f'hsla:{color2.hsla}')
print(f'i1i2i3:{color2.i1i2i3}')cmy:(0.8, 0.4, 0.0) 紅:51 綠:153 藍:255
cmy:(0.8117647058823529, 0.4156862745098039, 0.0039215686274509665) 紅:48 綠:149 藍:254
hsva:(20.0, 75.0, 78.43137254901961, 9.803921568627452)
hsla:(20.0, 60.00000000000001, 49.01960784313725, 9.803921568627452)
i1i2i3:(0.45751633986928103, 0.29411764705882354, -0.049019607843137254)更新色彩資訊
Color物件的update方法,可用於更新色彩中的紅色,綠色,藍色以及透明度資訊,其參數的含義和作用與Color類別的建構子相同,你可以檢視Color 物件一段來了解他們。
update(r, g, b, a=255)
update(rgbvalue)
update 方法可能不會更新色彩的透明度
如果你僅為update方法提供參數r,g,b,而沒有提供表示透明度的參數a,那麽色彩的透明度不會發生變化。
當然,上述情況不適用於參數rgbvalue,如果參數rgbvalue未包含透明度,那麽將采用預設透明度。
from pygame import Color
blue = Color(0, 0, 255, 100)
# 由於沒有提供參數 a,因此透明度不會發生變化
blue.update(0, 255, 0)
print(f'透明度:{blue.a}')
# 透明度會發生變化
blue.update('red')
print(f'透明度:{blue.a}')透明度:100
透明度:255以 RGBA 格式取得色彩資訊
Color物件的normalize方法,可用於取得 RGBA 格式的色彩資訊。
normalize()
- 傳回值
normalize方法的傳回值是一個形式類似於(R,G,B,A)的 Python 浮點數元組,其中R為紅色,G為綠色,B為藍色,A為透明度,他們的範圍是0到1。
# …
# 顯示 RGBA 格式的色彩資訊
print(Color([50, 150, 250, 100]).normalize())(0.19607843137254902, 0.5882352941176471, 0.9803921568627451, 0.39215686274509803)對色彩進行伽瑪校正
Color物件的correct_gamma方法,可用於對色彩進行伽瑪校正。
correct_gamma(gamma)
- gamma 參數
gamma參數是一個表示伽瑪值的浮點數,將采用該伽瑪值對色彩進行校正。- 傳回值
correct_gamma方法的傳回值是經過伽瑪校正的新的Color色彩物件。
from pygame import Color
# 對色彩進行伽瑪校正
c = Color(255, 150, 50, 100)
print(c.correct_gamma(1.5))(255, 115, 22, 63)將色彩轉換為灰階版本
Color物件的grayscale方法,可將色彩進行灰階轉換,並將轉換結果作為新的色彩物件傳回。
grayscale()
- 傳回值
grayscale方法的傳回值是經過灰階轉換的新的Color色彩物件。
from pygame import Color
# 將色彩轉換為灰階版本
c = Color(255, 150, 50, 100)
print(c.grayscale())(169, 169, 169, 100)計算色彩與其他色彩的插補
Color物件的lerp方法,可用於計算Color物件所表示的色彩與指定色彩之間的線性插補,並將計算結果作為新的色彩物件傳回。計算色彩的線性插補,可用於產生一些線性漸層效果,或產生效果接近的色彩。
lerp(color, amount)
- color 參數
color參數與Color物件的建構子的rgbvalue參數類似(你可以檢視Color 物件一段來了解更多),是一個包含色彩資訊的物件,他將參與插補計算。- amount 參數
amount參數是一個浮點數,取值範圍從0到1,越接近於0,色彩插補越接近於Color物件自身,越接近於1,色彩插補越接近於參數color。- 傳回值
lerp方法的傳回值是包含線性插補計算結果的新的Color色彩物件。
from pygame import Color
# 計算白色與黑色之間的線性插補
c = Color(255, 255, 255)
print(f'amount:{c.lerp("#000000", 0.1)}')
print(f'amount:{c.lerp("#000000", 0.9)}')amount:(230, 230, 230, 255)
amount:(25, 25, 25, 255)預先計算色彩的透明度
Color物件的premul_alpha方法,可預先將色彩中的透明度與紅色,綠色,藍色進行計算,並將計算結果作為新的色彩物件傳回。預先計算透明度對於混合模式BLEND_PREMULTIPLIED非常有效,因為該模式認為色彩中的紅色,綠色,藍色已經與透明度進行了計算,這可以在一定程度上改進算繪的效率。
premul_alpha()
- 傳回值
premul_alpha方法的傳回值是預先計算了透明度的新的Color色彩物件,該色彩物件的透明度與原有透明度相同。
from pygame import Color
# 預先計算透明度
c = Color(150, 20, 200, 50)
print(c.premul_alpha())(29, 4, 39, 50)對 Color 物件進行算術運算
Color物件支援使用算術運算子+,-,*,//,%,與另一個Color物件進行加法,減法,乘法,整除,取余運算。運算的規則為,將兩個Color物件的r,g,b,a變數分別進行計算,計算結果大於255則被視為255,計算結果小於0則被視為0,然後,根據計算結果產生一個新的色彩物件,新的色彩物件將作為運算式的傳回值。
color1 + color2
color1 - color2
color1 * color2
color1 // color2
color1 % color2
from pygame import Color
color1 = Color(100, 120, 200)
color2 = Color([50, 200, 90, 100])
# 在色彩物件之間,進行加,減,乘運算
print(f'{color1} + {color2} = {color1 + color2}')
print(f'{color1} - {color2} = {color1 - color2}')
print(f'{color1} * {color2} = {color1 * color2}')
# 在色彩物件之間,進行整除運算
print(f'{color1} // {color2} = {color1 // color2}')
# 在色彩物件之間,進行取余運算
print(f'{color1} % {color2} = {color1 % color2}')(100, 120, 200, 255) + (50, 200, 90, 100) = (150, 255, 255, 255)
(100, 120, 200, 255) - (50, 200, 90, 100) = (50, 0, 110, 155)
(100, 120, 200, 255) * (50, 200, 90, 100) = (255, 255, 255, 255)
(100, 120, 200, 255) // (50, 200, 90, 100) = (2, 0, 2, 2)
(100, 120, 200, 255) % (50, 200, 90, 100) = (0, 120, 20, 55)Color 物件之間的整除和取余運算允許除數為 0
在正常的 Python 整除和取余運算中,除數不能夠為0,否則會引發例外狀況ZeroDivisionError,但Color物件之間的整除和取余運算卻允許此情況的發生,當作為除數的r,g,b,a變數為0時,運算的結果為0。
# …
# 除數為 0 的情況
print(Color(0xFFFFFFFF) // Color(0x00000000))
print(Color(0xFFFFFFFF) % Color(0x00000000))(0, 0, 0, 0)
(0, 0, 0, 0)對 Color 物件進行比較運算
使用比較運算子==可比較兩個Color物件是否相等,如果運算式傳回True則表示相等。使用比較運算子!=可比較兩個Color物件是否不相等,如果運算式傳回True則表示不相等。
比較運算的規則為,將兩個Color物件的r,g,b,a變數分別進行比較,如果全部相等,則認為兩個Color物件相等。
color1 == color2
color1 != color2
# …
# 比較兩個色彩
color3 = Color(100, 120, 200, 200)
print(f'{color1} == {color3} {color1 == color3}')
print(f'{color1} != {color2} {color1 != color2}')(100, 120, 200, 255) == (100, 120, 200, 200) False
(100, 120, 200, 255) != (50, 200, 90, 100) True