如何在python中将RGB转换为CMYK,反之亦然?

Hai*_*irr 10 python colors

如果我有一个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)


db7*_*638 9

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


Tem*_*mak 8

但是转换完整图像 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)


pat*_*_ai 6

跟踪福兹先生的执行情况。

有两种可能的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)


Pet*_* O. 5

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

CMYK是基于四种墨水在纸张上形成颜色的方式;然而,墨水的颜色混合相当复杂,比用于形成 RGB 颜色模型中的颜色的“光”的混合还要复杂。

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

正如国际颜色联盟的CMYK 特征数据页面所示,CMYK 颜色没有像 sRGB 之于 RGB 那样普遍存在的意义。

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