如果我有一个 RGB 十进制数255, 165, 0
,我该怎么做才能将其转换为 CMYK?
例如:
>>> red, green, blue = 255, 165, 0
>>> rgb_to_cmyk(red, green, blue)
(0, 35, 100, 0)
这是Javascript 实现的 Python 端口。
RGB_SCALE = 255
CMYK_SCALE = 100
def rgb_to_cmyk(r, g, b):
if (r, g, b) == (0, 0, 0):
# black
return 0, 0, 0, CMYK_SCALE
# rgb [0,255] -> cmy [0,1]
c = 1 - r / RGB_SCALE
m = 1 - g / RGB_SCALE
y = 1 - b / RGB_SCALE
# 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 的好方法,但问题标题还包括
反之亦然
所以这是我对从 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 值。
但是转换完整图像 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')
跟进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 转换(在撰写本文时)并不准确。
CMYK是基于四种墨水如何在纸上形成颜色;但是,墨水的颜色混合相当复杂,比用于在 RGB 颜色模型中形成颜色的“光”混合更复杂。
由于 CMYK 很有用,首先,在打印图像时,任何转换为 CMYK 都需要考虑打印条件,包括使用什么打印机和使用什么纸张进行打印。出于打印目的准确转换为 CMYK 并非易事,并且需要校准打印机并测量测试纸上的 CMYK 色块等。
正如国际色彩联盟的CMYK 特征数据页面所示,CMYK 颜色与 sRGB 对 RGB 一样普遍存在并没有任何意义。
另请参阅我关于此主题的彩色文章。
要使这种转换有用,您需要一个色彩管理系统,其中包含描述被转换的 RGB 系统和 CMYK 系统的配置文件。
http://en.wikipedia.org/wiki/CMYK_color_model#Conversion
以下是关于如何使用 ICC 配置文件解决此问题的讨论:
如何使用 ICC 配置文件对一组任意像素值(而不是图像数据结构)执行颜色转换?
这是 pyCMS 的链接,它使用 ICC 颜色配置文件进行转换:
我尝试使用 bisounours_tronconneuse 提供的反向计算,但 CMYK (96 63 0 12) 失败。结果应该是:像这样
将 w3schools 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)