Color 颜色对象使用说明
关注 1260
如何在 Pygame 中创建、更改颜色视频演示 YouTube如何在 Pygame 中创建、更改颜色视频演示 Bilibili
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