18

如果我有一个 RGB 十进制数255, 165, 0,我该怎么做才能将其转换为 CMYK?

例如:

>>> red, green, blue = 255, 165, 0
>>> rgb_to_cmyk(red, green, blue)
(0, 35, 100, 0)
4

7 回答 7

20

这是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
于 2012-12-30T04:54:18.153 回答
11

接受的答案提供了从 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 值。

于 2017-10-31T19:20:48.833 回答
9

但是转换完整图像 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')
于 2016-05-02T12:01:51.973 回答
8

跟进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
于 2015-05-06T13:53:32.563 回答
3

对于大多数实际目的而言,使用已接受答案中给出的 CMYK 转换(在撰写本文时)并不准确。

CMYK是基于四种墨水如何在纸上形成颜色;但是,墨水的颜色混合相当复杂,比用于在 RGB 颜色模型中形成颜色的“光”混合更复杂。

由于 CMYK 很有用,首先,在打印图像时,任何转换为​​ CMYK 都需要考虑打印条件,包括使用什么打印机和使用什么纸张进行打印。出于打印目的准确转换为 CMYK 并非易事,并且需要校准打印机并测量测试纸上的 CMYK 色块等。

正如国际色彩联盟的CMYK 特征数据页面所示,CMYK 颜色与 sRGB 对 RGB 一样普遍存在并没有任何意义。

另请参阅我关于此主题的彩色文章。

于 2018-11-01T23:04:04.560 回答
2

要使这种转换有用,您需要一个色彩管理系统,其中包含描述被转换的 RGB 系统和 CMYK 系统的配置文件。

http://en.wikipedia.org/wiki/CMYK_color_model#Conversion

以下是关于如何使用 ICC 配置文件解决此问题的讨论:

如何使用 ICC 配置文件对一组任意像素值(而不是图像数据结构)执行颜色转换?

这是 pyCMS 的链接,它使用 ICC 颜色配置文件进行转换:

http://www.cazabon.com/pyCMS/

于 2012-12-30T04:54:25.797 回答
1

我尝试使用 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)
于 2016-12-19T10:06:19.227 回答