URLhttps://learnscript.net/zh/pygame/color/
    复制链接转到说明  示例

    Color 颜色对象使用说明

    我被代码海扁署名-非商业-禁演绎
    阅读 13:54·字数 4170·发布 

    Pygame 中的 Color 对象

    Pygame 包的Color对象可用于表示游戏中的颜色,并包含一些用于计算颜色的方法,以下是其构造器。

    Color(r, g, b, a=255)
    Color(rgbvalue)

    r 参数

    r参数是范围从0255的整数,表示颜色中的红色。

    g 参数

    g参数是范围从0255的整数,表示颜色中的绿色。

    b 参数

    b参数是范围从0255的整数,表示颜色中的蓝色。

    a 参数

    a参数是范围从0255的整数,表示颜色中的透明度,默认值为255(不透明)。

    rgbvalue 参数

    rgbvalue参数是一个包含颜色信息的对象,他可以是字符串,整数(可以书写为容易理解的十六进制格式0xRRGGBBAA,其中RR表示红色,GG表示绿色,BB表示蓝色,AA表示透明度),Python 整数序列对象(依次包含表示红色,绿色,蓝色的整数,或包含表示红色,绿色,蓝色,透明度的整数),或另一个Color对象。

    如果rgbvalue参数是一个字符串,那么该字符串可以是命名颜色的名称(至于命名颜色,你可以参考给出的链接),或形式类似于'#RRGGBBAA''#RRGGBB''0xRRGGBBAA''0xRRGGBB'RR表示红色,GG表示绿色,BB表示蓝色,AA表示透明度)。

    pygame.Color — pygame v2.6.0 documentation

    在下面的示例中,我们创建了一些颜色对象,并将他们绘制在了表面对象中。

    create.py
    # 导入 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对象的变量rgba,可用于获取或设置颜色中的红色,绿色,蓝色以及透明度。

    color.r
    color.g
    color.b
    color.a
    color.r = r
    color.g = g
    color.b = b
    color.a = a

    r 值

    r是范围从0255的整数,表示颜色中的红色。

    g 值

    g是范围从0255的整数,表示颜色中的绿色。

    b 值

    b是范围从0255的整数,表示颜色中的蓝色。

    a 值

    a是范围从0255的整数,表示颜色中的透明度,默认值为255(不透明)。

    info.py
    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对象的变量cmyhsvahslai1i2i3,可使用颜色格式 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表示黄色,他们的取值范围是01

    hsva 值

    hsva是一个形式类似于(H,S,V,A)的 Python 浮点数元组,其中H表示色调,取值范围是0360S表示饱和度,取值范围是0100V表示明度,取值范围是0100A表示透明度,取值范围是0100

    hsla 值

    hsla是一个形式类似于(H,S,L,A)的 Python 浮点数元组,其中HSA所表示的含义和取值范围与hsva相同,L表示亮度,取值范围是0100

    这里需要指出,虽然hsla中的Shsva中的S含义相同,但计算方式却存在差异,因此同一个颜色在 HSVA 和 HSLA 格式中的饱和度不一定相同。

    i1i2i3 值

    i1i2i3是一个形式类似于(I1,I2,I3)的 Python 浮点数元组,其中I1取值范围是01I2取值范围是-0.50.5I3取值范围是-0.50.5

    info.py
    # 以 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方法提供参数rgb,而没有提供表示透明度的参数a,那么颜色的透明度不会发生变化。

    当然,上述情况不适用于参数rgbvalue,如果参数rgbvalue未包含透明度,那么将采用默认透明度。

    update.py
    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为透明度,他们的范围是01

    info.py
    # …
    # 显示 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颜色对象。

    gamma.py
    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颜色对象。

    grayscale.py
    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参数是一个浮点数,取值范围从01,越接近于0,颜色插值越接近于Color对象自身,越接近于1,颜色插值越接近于参数color

    返回值

    lerp方法的返回值是包含线性插值计算结果的新的Color颜色对象。

    lerp.py
    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颜色对象,该颜色对象的透明度与原有透明度相同。

    premul_alpha.py
    from pygame import Color
    
    # 预先计算透明度 c = Color(150, 20, 200, 50) print(c.premul_alpha())
    (29, 4, 39, 50)

    对 Color 对象进行算术运算

    Color对象支持使用算术运算符+-*//%,与另一个Color对象进行加法,减法,乘法,整除,取余运算。运算的规则为,将两个Color对象的rgba变量分别进行计算,计算结果大于255则被视为255,计算结果小于0则被视为0,然后,根据计算结果产生一个新的颜色对象,新的颜色对象将作为表达式的返回值。

    color1 + color2
    color1 - color2
    color1 * color2
    color1 // color2
    color1 % color2

    operations.py
    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对象之间的整除和取余运算却允许此情况的发生,当作为除数的rgba变量为0时,运算的结果为0

    operations.py
    # …
    # 除数为 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对象的rgba变量分别进行比较,如果全部相等,则认为两个Color对象相等。

    color1 == color2
    color1 != color2

    operations.py
    # …
    # 比较两个颜色
    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

    源码

    src/zh/color·codebeatme/pygame·GitHub

    讲解视频

    如何在 Pygame 中创建、更改颜色·YouTube如何在 Pygame 中创建、更改颜色·Bilibili