2012-12-30 78 views

回答

7

这里有一个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 
+0

mistype:[min_cmy = min(c,m,* y *)] –

+0

没有icc,这不是一个非常有意义的函数 – jedierikb

+1

@Denis:thanks;固定。 –

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

跟随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 
+0

'cmyk_to_rgb'给出负值,例如c = 100,m = 100,y = 100,k = 100 => r = -255,g = -255,b = -255。其次,你为什么需要自己? – gkcn

+0

@gkcn谢谢,实际上不应该有一个“自我”(在我自己的代码中,它是在一个班级,这是有自我的地方,我忘了删除它在我的复制粘贴)。 –

+0

@ gkcn c = 100,m = 100,y = 100,k = 100不是有效的cmyk值,这就是原因。 –

-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') 
0

我试图使用由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) 
0

接受的答案提供了一个很好的方式,从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值。

相关问题