有很多方法可以做到这一点。您选择如何做取决于您看重速度和简单性还是感知一致性。如果您需要它真正均匀,您将需要使用颜色配置文件定义 RGB 颜色,并且需要配置文件的原色,以便您可以转换为 XYZ,然后转换为 LAB,您可以在其中操作 L 通道。
大多数时候您不需要这样做,您可以使用简单的 HSB 模型,就像 Photoshop 在信息调色板中所做的那样。
为此,您只需想象 3D 空间中 RGB 点和白点之间的一条线,然后沿着该线移动颜色。实际上,您只需为该线创建一个参数方程并移动参数即可。
import numpy as np
def lighter(color, percent):
'''assumes color is rgb between (0, 0, 0) and (255, 255, 255)'''
color = np.array(color)
white = np.array([255, 255, 255])
vector = white-color
return color + vector * percent
百分比 0.0 将返回相同的颜色,1.0 将返回白色。两者之间的所有颜色都将是相同色调的较浅色调。这应该会为您提供与 Photoshop 的 HSB 实现一致的结果,但将取决于设备并且可能不完全一致。
如果你有RGB [200, 100, 50]
并输入 0.50 的百分比,它应该返回RGB[ 227.5 177.5 152.5]
Photoshop 将两者报告为 20° 的色调。
如果没有 numpy,做到这一点并不难,但是元素明智的操作很方便。
根据评论进行编辑:
我并不是建议你这样做,除非你知道你确实需要以艰难的方式去做。但如果您想转换为 LAB,则无需太多麻烦。最重要的是,您需要首先知道 RGB 数字所处的色彩空间,或者需要对其含义做出一些假设。由于 sRGB 在网络上相当标准,因此我在这里假设。
转换并不困难,但很容易出错。令人高兴的是,有一个非常好的色彩数学模块,并且有很好的文档:https://github.com/gtaylor/python-colormath https://github.com/gtaylor/python-colormath
使用它,您可以在 sRGB 和 LAB 之间进行转换,如下所示:
from colormath.color_objects import sRGBColor, LabColor
from colormath.color_conversions import convert_color
sRGB = sRGBColor(126, 126, 126, is_upscaled=True) # or between [0, 1] with out is_upscaled
lab = convert_color(sRGB, LabColor)
实验室现在是带有亮度通道的颜色lab.lab_l
您可以在黑色 (0) 和白色 (100) 之间上下移动。这在视觉上应该比 HSB 更加统一(但是,根据您的应用程序,可能不足以保证这项工作)。
你可以简单地改变lab_l
然后转换回来:
lab.lab_l = 80
new_sRGB = convert_color(lab, color_objects.sRGBColor).get_upscaled_value_tuple()
new_sRGB
is now [198, 198, 198]
。 colormath 为您解决了光源和伽玛问题。