有很多方法可以做到这一点。您如何选择将取决于您是否重视速度和简单性或感知一致性。如果您需要它真正统一,则需要使用颜色配置文件定义 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 在网络上是相当标准的,所以我在这里假设。
转换并不难,但很容易出错。令人高兴的是,有一个非常漂亮的 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.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 现在是 [198, 198, 198]。 colormath 为您解决了光源和伽马问题。