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

时间:2012-12-30 04:44:39

标签: python colors

如果我有一个RGB小数,例如255, 165, 0,我该怎么做才能将它转换为CMYK?

例如:

>>> red, green, blue = 255, 165, 0
>>> rgb_to_cmyk(red, green, blue)
(0, 35, 100, 0)

7 个答案:

答案 0 :(得分:9)

这是一个Javascript implementation的Python端口。

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 / 255.
    m = 1 - g / 255.
    y = 1 - b / 255.

    # extract out k [0,1]
    min_cmy = min(c, m, y)
    c = (c - min_cmy) / (1 - min_cmy)
    m = (m - min_cmy) / (1 - min_cmy)
    y = (y - min_cmy) / (1 - 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

答案 1 :(得分:3)

跟进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

答案 2 :(得分:2)

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

http://en.wikipedia.org/wiki/CMYK_color_model#Conversion

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

How can one perform color transforms with ICC profiles on a set of arbitrary pixel values (not on an image data structure)?

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

http://www.cazabon.com/pyCMS/

答案 3 :(得分:2)

接受的答案提供了从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值。

答案 4 :(得分:1)

但转换完整图像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')

答案 5 :(得分:1)

我尝试使用bisounours_tronconneuse提供的反向计算,但CMYK失败(96 63 0 12)。结果应为:like this

将w3schools javascript(code here)转换为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)

答案 6 :(得分:0)

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

CMYK基于四种墨水在纸上形成颜色的方式;但是,墨水的颜色混合非常复杂,比用于在RGB颜色模型中形成颜色的“光”混合要复杂得多。

由于CMYK很有用,因此,在打印图像时,任何向CMYK的转换都必须考虑打印条件,包括使用什么打印机和哪种纸张进行打印。为打印目的而准确地转换为CMYK并非易事,除其他外,还需要校准打印机并测量测试纸上的CMYK色块。

正如国际色彩协会的page of CMYK characterization data所说明的那样,对于sRGB来说,没有像sRGB那样普遍存在的CMYK颜色。

另请参阅my color article