如果我有一个RGB小数,例如255, 165, 0
,我该怎么做才能将它转换为CMYK?
例如:
>>> red, green, blue = 255, 165, 0
>>> rgb_to_cmyk(red, green, blue)
(0, 35, 100, 0)
答案 0 :(得分:9)
这是一个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
答案 1 :(得分: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
答案 2 :(得分:2)
要使此转换有用,您需要一个色彩管理系统,其中的配置文件描述了RGB系统和正在转换的CMYK系统。
http://en.wikipedia.org/wiki/CMYK_color_model#Conversion
以下讨论如何使用ICC配置文件解决此问题:
这是pyCMS的链接,它使用ICC颜色配置文件进行转换:
答案 3 :(得分:2)
接受的答案提供了从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值。
答案 4 :(得分: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')
答案 5 :(得分:1)
我尝试使用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)
答案 6 :(得分:0)
使用CMYK转换(如在撰写本文时接受的答案中给出的转换)不准确,对于大多数实际目的。
CMYK基于四种墨水在纸上形成颜色的方式;但是,墨水的颜色混合非常复杂,比用于在RGB颜色模型中形成颜色的“光”混合要复杂得多。
由于CMYK很有用,因此,在打印图像时,任何向CMYK的转换都必须考虑打印条件,包括使用什么打印机和哪种纸张进行打印。为打印目的而准确地转换为CMYK并非易事,除其他外,还需要校准打印机并测量测试纸上的CMYK色块。
正如国际色彩协会的page of CMYK characterization data所说明的那样,对于sRGB来说,没有像sRGB那样普遍存在的CMYK颜色。
另请参阅my color article。