2012-12-30 80 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值。

相關問題