如果我有一個RGB小數,如255, 165, 0
,我該怎麼做才能將其轉換爲CMYK?如何在Python中將RGB轉換爲CMYK,反之亦然?
例如:
>>> red, green, blue = 255, 165, 0
>>> rgb_to_cmyk(red, green, blue)
(0, 35, 100, 0)
如果我有一個RGB小數,如255, 165, 0
,我該怎麼做才能將其轉換爲CMYK?如何在Python中將RGB轉換爲CMYK,反之亦然?
例如:
>>> red, green, blue = 255, 165, 0
>>> rgb_to_cmyk(red, green, blue)
(0, 35, 100, 0)
這裏有一個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
在該轉換是有用的,則需要一個色彩管理系統,具有描述RGB系統和CMYK系統配置文件被轉換。
http://en.wikipedia.org/wiki/CMYK_color_model#Conversion
下面是如何使用ICC配置文件來解決這個問題的討論:
這裏是pyCMS一個鏈接,它使用ICC色彩配置文件來執行轉換:
跟隨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
'cmyk_to_rgb'給出負值,例如c = 100,m = 100,y = 100,k = 100 => r = -255,g = -255,b = -255。其次,你爲什麼需要自己? – gkcn
@gkcn謝謝,實際上不應該有一個「自我」(在我自己的代碼中,它是在一個班級,這是有自我的地方,我忘了刪除它在我的複製粘貼)。 –
@ gkcn c = 100,m = 100,y = 100,k = 100不是有效的cmyk值,這就是原因。 –
但是轉換完整圖像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_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)
接受的答案提供了一個很好的方式,從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值。
mistype:[min_cmy = min(c,m,* y *)] –
沒有icc,這不是一個非常有意義的函數 – jedierikb
@Denis:thanks;固定。 –