【问题标题】:PIL: Convert RGB image to a specific 8-bit palette?PIL:将 RGB 图像转换为特定的 8 位调色板?
【发布时间】:2010-06-25 01:06:03
【问题描述】:

使用 Python Imaging Library,我可以调用

img.convert("P", palette=Image.ADAPTIVE)

img.convert("P", palette=Image.WEB)

但是有没有办法转换成任意调色板?

p = []
for i in range(0, 256):
    p.append(i, 0, 0)
img.convert("P", palette=p)

它将每个像素映射到图像中最接近的颜色?或者 Image.WEB 是否支持此功能?

【问题讨论】:

    标签: python image palette


    【解决方案1】:

    在查看convert() 的源代码时,我看到它引用了im.quantizequantize 可以采用调色板参数。如果您提供的图像具有调色板,则此函数将获取该调色板并将其应用于图像。

    例子:

        src = Image.open("sourcefilewithpalette.bmp")
        new = Image.open("unconvertednew24bit.bmp")
        converted = new.quantize(palette=src)
        converted.save("converted.bmp")
    

    另一个提供的答案对我不起作用(它做了一些非常糟糕的双调色板转换或其他事情,)但是这个解决方案可以。

    【讨论】:

      【解决方案2】:

      ImagePalettemodule docs's 第一个示例显示了如何将调色板附加到图像,但该图像必须已经是模式"P""L"。但是,可以调整该示例以将完整的 RGB 图像转换为您选择的调色板:

      from __future__ import division
      import Image
      
      palette = []
      levels = 8
      stepsize = 256 // levels
      for i in range(256):
          v = i // stepsize * stepsize
          palette.extend((v, v, v))
      
      assert len(palette) == 768
      
      original_path = 'original.jpg'
      original = Image.open(original_path)
      converted = Image.new('P', original.size)
      converted.putpalette(palette)
      converted.paste(original, (0, 0))
      converted.show()
      

      【讨论】:

      • 你测试过这个吗?
      • 我很确定我当时是这样做的(大约 5 年前)。它不适合你吗?
      • 我没试过。我最终使用了 im.quantize()
      猜你喜欢
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 2011-03-02
      • 2018-08-15
      • 2018-10-23
      相关资源
      最近更新 更多