Mar*_*yer 16
有很多方法可以做到这一点.您如何选择这取决于您是否重视速度和简单性或感知均匀性.如果你需要它是真正统一的,你需要用颜色配置文件定义RGB颜色,你需要配置文件的原色,这样你就可以转换为XYZ,然后转换到LAB,你可以操作L通道.
大多数情况下,您不需要这样做,而是可以使用像Photoshop一样的简单HSB模型.
要做到这一点,您只需想象一下RGB点与3D空间中的白点之间的一条线,并沿着该线移动颜色.实际上,您可以为该线创建参数方程并移动参数.
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
Run Code Online (Sandbox Code Playgroud)
百分比0.0将返回相同的颜色,1.0将返回白色.之间的一切都将是相同色调的浅色调.这应该给你的结果与Photoshop的HSB实现一致,但将取决于设备,可能不完全统一.
如果你有RGB [200, 100, 50]
.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)
Run Code Online (Sandbox Code Playgroud)
实验室现在是一种带有亮度通道的颜色lab.lab_l
,您可以在黑色(0)和白色(100)之间上下移动.这应该比HSB在感知上更统一(但是,根据您的应用,可能还不足以保证工作).
您只需更改lab_l
然后转换回:
lab.lab_l = 80
new_sRGB = convert_color(lab, color_objects.sRGBColor).get_upscaled_value_tuple()
Run Code Online (Sandbox Code Playgroud)
new_sRGB
现在[198, 198, 198]
.colormath为您处理光源和伽玛问题.
只需在颜色和白色之间进行线性插值:
def lerp(a, b, t):
return a*(1 - t) + b*t
import numpy as np
white = np.array([255, 255, 255])
my_color = np.array([...])
lightened25 = lerp(my_color, white, 0.25)
Run Code Online (Sandbox Code Playgroud)
或者没有numpy:
lightened25 = [lerp(c, w, 0.25) for c, w in zip(my_color, white)]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7078 次 |
最近记录: |