Color 颜色对象使用说明
关注 1800
如何在 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
透明度: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