在python中如何将RGB转换为CMYK,反之亦然?

在python中如何将RGB转换为CMYK,反之亦然?,python,colors,Python,Colors,如果我有一个RGB十进制,比如255、165、0,我该如何将其转换为CMYK 例如: >>> red, green, blue = 255, 165, 0 >>> rgb_to_cmyk(red, green, blue) (0, 35, 100, 0) 这里有一个Python端口 要使此转换有用,您需要一个颜色管理系统,其配置文件描述正在转换的RGB系统和CMYK系统 下面讨论如何使用ICC配置文件解决此问题: 以下是pyCMS的链接,pyCMS使用I

如果我有一个RGB十进制,比如
255、165、0
,我该如何将其转换为CMYK

例如:

>>> red, green, blue = 255, 165, 0
>>> rgb_to_cmyk(red, green, blue)
(0, 35, 100, 0)
这里有一个Python端口


要使此转换有用,您需要一个颜色管理系统,其配置文件描述正在转换的RGB系统和CMYK系统

下面讨论如何使用ICC配置文件解决此问题:

以下是pyCMS的链接,pyCMS使用ICC颜色配置文件进行转换:

rgb_scale = 255
cmyk_scale = 100


def rgb_to_cmyk(r,g,b):
    if (r == 0) and (g == 0) and (b == 0):
        # black
        return 0, 0, 0, cmyk_scale

    # rgb [0,255] -> cmy [0,1]
    c = 1 - r / float(rgb_scale)
    m = 1 - g / float(rgb_scale)
    y = 1 - b / float(rgb_scale)

    # extract out k [0,1]
    min_cmy = min(c, m, y)
    c = (c - min_cmy) 
    m = (m - min_cmy) 
    y = (y - min_cmy) 
    k = min_cmy

    # rescale to the range [0,cmyk_scale]
    return c*cmyk_scale, m*cmyk_scale, y*cmyk_scale, k*cmyk_scale

def cmyk_to_rgb(c,m,y,k):
    """
    """
    r = rgb_scale*(1.0-(c+k)/float(cmyk_scale))
    g = rgb_scale*(1.0-(m+k)/float(cmyk_scale))
    b = rgb_scale*(1.0-(y+k)/float(cmyk_scale))
    return r,g,b

跟进Fooz先生的实施情况

CMYK有两种可能的实现方式。有一种是比例与白色空间有关的(例如在GIMP中使用),也有一种是由Fooz先生实现的,但还有另一种CMYK实现(例如由LibreOffice使用),它给出了颜色与总颜色空间的比例。如果您希望使用CMYK来模拟油漆或墨水的混合,那么第二种方法可能会更好,因为颜色可以使用每种颜色的权重(0.5表示半种混合物)线性相加

以下是带反向转换的CMYK的第二个版本:

rgb_scale = 255
cmyk_scale = 100


def rgb_to_cmyk(r,g,b):
    if (r == 0) and (g == 0) and (b == 0):
        # black
        return 0, 0, 0, cmyk_scale

    # rgb [0,255] -> cmy [0,1]
    c = 1 - r / float(rgb_scale)
    m = 1 - g / float(rgb_scale)
    y = 1 - b / float(rgb_scale)

    # extract out k [0,1]
    min_cmy = min(c, m, y)
    c = (c - min_cmy) 
    m = (m - min_cmy) 
    y = (y - min_cmy) 
    k = min_cmy

    # rescale to the range [0,cmyk_scale]
    return c*cmyk_scale, m*cmyk_scale, y*cmyk_scale, k*cmyk_scale

def cmyk_to_rgb(c,m,y,k):
    """
    """
    r = rgb_scale*(1.0-(c+k)/float(cmyk_scale))
    g = rgb_scale*(1.0-(m+k)/float(cmyk_scale))
    b = rgb_scale*(1.0-(y+k)/float(cmyk_scale))
    return r,g,b

但转换完整图像RGB2CMYK或反之亦然非常简单

from PIL import Image
image = Image.open(path_to_image)

if image.mode == 'CMYK':
    rgb_image = image.convert('RGB')

if image.mode == 'RGB':
    cmyk_image = image.convert('CMYK')

我尝试使用bisounours_Trononneuse提供的反向计算,但对CMYK(96 63 0 12)失败。结果应该是:

将javascript()转换为python,下面的代码现在返回正确的结果:

def cmykToRgb(c, m, y, k) :
    c=float(c)/100.0
    m=float(m)/100.0
    y=float(y)/100.0
    k=float(k)/100.0
    r = round(255.0 - ((min(1.0, c * (1.0 - k) + k)) * 255.0))
    g = round(255.0 - ((min(1.0, m * (1.0 - k) + k)) * 255.0))
    b = round(255.0 - ((min(1.0, y * (1.0 - k) + k)) * 255.0))
    return (r,g,b)

被接受的答案提供了一个从RGB到CMYK的好方法,但问题标题也包括

反之亦然

以下是我对从CMYK到RGB转换的贡献:

def cmyk_to_rgb(c, m, y, k, cmyk_scale, rgb_scale=255):
    r = rgb_scale * (1.0 - c / float(cmyk_scale)) * (1.0 - k / float(cmyk_scale))
    g = rgb_scale * (1.0 - m / float(cmyk_scale)) * (1.0 - k / float(cmyk_scale))
    b = rgb_scale * (1.0 - y / float(cmyk_scale)) * (1.0 - k / float(cmyk_scale))
    return r, g, b

与patapouf_ai的答案不同,该函数不会产生负rgb值。

使用CMYK转换,如接受答案中给出的转换(在撰写本文时),对于大多数实际目的而言并不准确

CMYK是基于四种油墨如何在纸上形成颜色;然而,油墨的颜色混合相当复杂,比RGB颜色模型中用于形成颜色的“光”的混合复杂得多

由于CMYK非常有用,因此,在打印图像时,对CMYK的任何转换都需要考虑打印条件,包括使用哪台打印机和哪种纸张进行打印。准确转换为CMYK进行打印并非易事,需要校准打印机并测量测试表上的CMYK补丁,以及其他事项

正如国际颜色联盟的报告所示,CMYK颜色对于RGB来说没有意义,因为sRGB对于RGB来说是无处不在的


另请参见此主题。

mistype:[min\u cmy=min(c,m,y)]如果没有icc,这不是一个非常有意义的函数
cmyk\u to\u rgb
给出负值,例如c=100,m=100,y=100,k=100=>r=-255,g=-255,b=-255。其次,你为什么需要self?@gkcn谢谢,确实不应该有“self”(在我自己的代码中,它在一个类中,那里有self,我只是忘记在我的复制粘贴中删除它)。@gkcn c=100,m=100,y=100,k=100不是有效的cmyk值,这就是为什么。