如果我有一个RGB小数,例如255, 165, 0,我该怎么做才能将它转换为CMYK?
例如:
>>> red, green, blue = 255, 165, 0
>>> rgb_to_cmyk(red, green, blue)
(0, 35, 100, 0)
Run Code Online (Sandbox Code Playgroud)
Mr *_*ooz 13
这是一个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
Run Code Online (Sandbox Code Playgroud)
接受的答案提供了从 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
Run Code Online (Sandbox Code Playgroud)
与 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')
Run Code Online (Sandbox Code Playgroud)
跟踪福兹先生的执行情况。
有两种可能的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
Run Code Online (Sandbox Code Playgroud)
对于大多数实际用途而言,使用已接受的答案(在撰写本文时)中给出的 CMYK 转换并不准确。
CMYK是基于四种墨水在纸张上形成颜色的方式;然而,墨水的颜色混合相当复杂,比用于形成 RGB 颜色模型中的颜色的“光”的混合还要复杂。
由于CMYK很有用,首先,在打印图像时,任何转换为CMYK都需要考虑打印条件,包括使用什么打印机和什么纸张进行打印。出于打印目的而准确转换为 CMYK 并非易事,需要校准打印机并测量测试纸上的 CMYK 色块等。
正如国际颜色联盟的CMYK 特征数据页面所示,CMYK 颜色没有像 sRGB 之于 RGB 那样普遍存在的意义。
另请参阅我关于此主题的彩色文章。
| 归档时间: |
|
| 查看次数: |
14518 次 |
| 最近记录: |