如果我有一个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;固定。 –