在python中如何将RGB转换为CMYK,反之亦然?
如果我有一个RGB十进制,比如在python中如何将RGB转换为CMYK,反之亦然?,python,colors,Python,Colors,如果我有一个RGB十进制,比如255、165、0,我该如何将其转换为CMYK 例如: >>> red, green, blue = 255, 165, 0 >>> rgb_to_cmyk(red, green, blue) (0, 35, 100, 0) 这里有一个Python端口 要使此转换有用,您需要一个颜色管理系统,其配置文件描述正在转换的RGB系统和CMYK系统 下面讨论如何使用ICC配置文件解决此问题: 以下是pyCMS的链接,pyCMS使用I
255、165、0
,我该如何将其转换为CMYK
例如:
>>> red, green, blue = 255, 165, 0
>>> rgb_to_cmyk(red, green, blue)
(0, 35, 100, 0)
这里有一个Python端口
要使此转换有用,您需要一个颜色管理系统,其配置文件描述正在转换的RGB系统和CMYK系统 下面讨论如何使用ICC配置文件解决此问题: 以下是pyCMS的链接,pyCMS使用ICC颜色配置文件进行转换:
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
跟进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
但转换完整图像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_Trononneuse提供的反向计算,但对CMYK(96 63 0 12)失败。结果应该是: 将javascript()转换为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值。使用CMYK转换,如接受答案中给出的转换(在撰写本文时),对于大多数实际目的而言并不准确 CMYK是基于四种油墨如何在纸上形成颜色;然而,油墨的颜色混合相当复杂,比RGB颜色模型中用于形成颜色的“光”的混合复杂得多 由于CMYK非常有用,因此,在打印图像时,对CMYK的任何转换都需要考虑打印条件,包括使用哪台打印机和哪种纸张进行打印。准确转换为CMYK进行打印并非易事,需要校准打印机并测量测试表上的CMYK补丁,以及其他事项 正如国际颜色联盟的报告所示,CMYK颜色对于RGB来说没有意义,因为sRGB对于RGB来说是无处不在的
另请参见此主题。mistype:[min\u cmy=min(c,m,y)]如果没有icc,这不是一个非常有意义的函数
cmyk\u to\u rgb
给出负值,例如c=100,m=100,y=100,k=100=>r=-255,g=-255,b=-255。其次,你为什么需要self?@gkcn谢谢,确实不应该有“self”(在我自己的代码中,它在一个类中,那里有self,我只是忘记在我的复制粘贴中删除它)。@gkcn c=100,m=100,y=100,k=100不是有效的cmyk值,这就是为什么。