adobe - sRGB 和 Adob​​eRGB 的数学转换

标签 adobe rgb srgb

这是一个非常明确的问题,但我做了很多研究,但没有找到答案。 StackOverflow 问题为 thisthis是关于 jpeg 转换的。 This是关于 python 内置库的。

那么,如何将 sRGB 转换为 Adob​​eRGB,反之亦然???我的意思是一个数学函数,将 3 个字节转换为 3 个字节。没有jpg,等等。只是使用笔和纸转换颜色的数学函数。

是的,Photoshop 确实做到了这一点,并且有一些奇怪的在线计算器,显示了另一个结果。

为什么我在 google 中找不到简单的公式?

我开始思考,我不知道某些事情,而且我的问题没有直接答案。

如果有人能描述发生了什么或给出公式,我将非常感激。

更新

整数 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

关于adobe - sRGB 和 Adob​​eRGB 的数学转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40017741/

相关文章:

html - Adobe XD Export 不转换 HTML 和 CSS

css - 在 Adob​​e Flex Builder (Eclipse) 中调整 CSS 验证

css - 使用 sRGB 照片和监视器 RGB 合成开发网站的颜色配置文件策略

c++ - 为什么仅当我在 SDL2 中设置非零 alpha 大小时才获得 sRGB 帧缓冲区?

javascript - 如何在adobe pro文件的javascript函数中向文件名添加日期和时间?

excel - 在 Excel VBA 用户窗体中显示 PDF

c - 处理图像时,它在 GTK 中得到奇怪的颜色

c++ - SIMD : Why is the SSE RGB to YUV color conversion about the same speed as the c++ implementation?

colors - 寻找 N 个不同的 RGB 颜色

css - 在 Web 上的何处可以获得有关支持 12 位颜色深度的信息?