【问题标题】:How can I convert RGB to CMYK and vice versa in python?如何在 python 中将 RGB 转换为 CMYK,反之亦然?
【发布时间】:2012-12-14 19:58:40
【问题描述】:

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

例如:

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

【问题讨论】:

    标签: python colors


    【解决方案1】:

    这是Javascript implementation 的 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
    

    【讨论】:

    • 错误输入:[min_cmy = min(c, m, y)]
    • 没有icc,这不是很有意义的功能
    【解决方案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 值。

    【讨论】:

      【解决方案3】:

      但转换全图 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')
      

      【讨论】:

        【解决方案4】:

        跟进 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_to_rgb 给出负值,例如c=100, m=100, y=100, k=100 => r=-255, g=-255, b=-255。第二,你为什么需要 self?
        • @gkcn 谢谢,确实不应该有“自我”(在我自己的代码中,它在一个类中,那是有自我的地方,我只是忘记在我的副本中删除它-粘贴)。
        • @gkcn c=100, m=100, y=100, k=100 不是有效的 cmyk 值,这就是原因。
        【解决方案5】:

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

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

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

        正如国际色彩联盟的page of CMYK characterization data 所说明的那样,CMYK 颜色就像 sRGB 对 RGB 一样无处不在,没有任何意义。

        有关此主题,另请参阅 my color article

        【讨论】:

          【解决方案6】:

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

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

          这里讨论了如何使用 ICC 配置文件来解决这个问题:

          How can one perform color transforms with ICC profiles on a set of arbitrary pixel values (not on an image data structure)?

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

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

          【讨论】:

            【解决方案7】:

            我尝试使用 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)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-03-19
              • 1970-01-01
              • 2019-10-18
              • 2010-09-17
              • 1970-01-01
              • 2014-07-22
              • 2010-10-16
              相关资源
              最近更新 更多