这是非常明确的问题,但我已经做了很多研究而没有找到答案.StackOverflow 这个或者这个问题是关于jpeg转换的.这是关于python内置库的.
那么,如何将sRGB转换为AdobeRGB,反之亦然??? 我的意思是一个数学函数,将3个字节转换为3个字节.没有jpges,等等.只是用笔和纸转换颜色的数学函数.
是的,Photoshop实际上是这样做的,有一些奇怪的在线计算器,显示另一个结果.
为什么我不能在谷歌找到一个简单的公式?
我开始思考,我不知道什么,我的问题没有直接答案.
如果有人可以描述,正在发生什么或给出公式,我将非常感激.
UPDATE
整数rgbs的大量结果也将是正确的答案.
这是实现公式的Python代码。如注释中所述,您从一种颜色空间转换为XYZ(规范化),然后从XYZ转换为新的颜色空间。对于这些功能的准确性,我不是100%满意的,但是它应该会让您大开眼界。当我提出改进时,我将其编辑为答案。
def linear_sRGB(c):
if c <= 0.04045:
return c / 12.92
else:
return pow((c + 0.055) / 1.055, 2.4)
def sRGB_to_XYZn(r, g, b):
Rlin = linear_sRGB(r / 255.0)
Glin = linear_sRGB(g / 255.0)
Blin = linear_sRGB(b / 255.0)
Xn = Rlin * 0.4124 + Glin * 0.3576 + Blin * 0.1805
Yn = Rlin * 0.2126 + Glin * 0.7152 + Blin * 0.0722
Zn = Rlin * 0.0193 + Glin * 0.1192 + Blin * 0.9505
return Xn, Yn, Zn
def gamma_sRGB(c):
if c <= 0.0031308:
return 12.92 * c
else:
return 1.055 * pow(c, 1/2.4) - 0.055
def XYZn_to_sRGB(Xn, Yn, Zn):
Rlin = Xn * 3.2406255 + Yn *-1.5372080 + Zn *-0.4986286
Glin = Xn *-0.9689307 + Yn * 1.8757561 + Zn * 0.0415175
Blin = Xn * 0.0557101 + Yn *-0.2040211 + Zn * 1.0569959
R = round(255 * gamma_sRGB(Rlin))
G = round(255 * gamma_sRGB(Glin))
B = round(255 * gamma_sRGB(Blin))
return R, G, B
def linear_AdobeRGB(c):
if c <= 0.0:
return 0.0
return pow(c, 2.19921875)
def AdobeRGB_to_XYZn(R, G, B):
Rlin = linear_AdobeRGB(R / 255.0)
Glin = linear_AdobeRGB(G / 255.0)
Blin = linear_AdobeRGB(B / 255.0)
Xn = Rlin * 0.57667 + Glin * 0.18556 + Blin * 0.18823
Yn = Rlin * 0.29734 + Glin * 0.62736 + Blin * 0.07529
Zn = Rlin * 0.02703 + Glin * 0.07069 + Blin * 0.99134
return Xn, Yn, Zn
def gamma_AdobeRGB(c):
if c <= 0.0:
return 0.0
return pow(c, 1/2.19921875)
def XYZn_to_AdobeRGB(Xn, Yn, Zn):
Rlin = Xn * 2.04159 + Yn *-0.56501 + Zn *-0.34473
Glin = Xn *-0.96924 + Yn * 1.87597 + Zn * 0.04156
Blin = Xn * 0.01344 + Yn *-0.11836 + Zn * 1.01517
R = round(255 * gamma_AdobeRGB(Rlin))
G = round(255 * gamma_AdobeRGB(Glin))
B = round(255 * gamma_AdobeRGB(Blin))
return R, G, B
Run Code Online (Sandbox Code Playgroud)