Color 色彩物件使用說明
訂閱 375
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
透明度:0
Color
物件的變數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