【问题标题】:Python PIL: Create indexed color image with transparent backgroundPython PIL:创建具有透明背景的索引彩色图像
【发布时间】:2011-12-05 17:02:44
【问题描述】:

我想知道如何创建具有透明背景和只有 2 种索引颜色(红色和蓝色)的图像以最小化文件大小?

更具体地说,我有两张要转换的黑白图像,一张转换为透明和蓝色,另一张转换为透明和红色。然后我想合并这两个图像。我可以使用常规的 RGBA 图像来做到这一点,但我真的希望对颜色进行索引以最小化文件大小。

最好使用 PIL,但其他 Python 库也可以工作。

【问题讨论】:

    标签: python transparency python-imaging-library indexed-image


    【解决方案1】:

    所以我设法做到了,使用“调色板”图像类型,但生成的文件并不像我预期的那么小...... 这是我的代码,以防它对其他人有用,或者如果有人可以改进它。

    from PIL import Image
    
    im = Image.open("image1.png")
    imP = im.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=3)
    imP.putpalette([
        0, 0, 0, # index 0 is black background
        0, 0, 255, # index 1 is blue
        255, 0, 0, # index 2 is red ])
    
    im2 = Image.open("image2.png")
    imP2L = im2.convert('L') # need a greyscale image to create a mask
    mask = Image.eval(imP2L, lambda a: 255 if a == 0 else 0)
    imP.paste(2, mask) # Paste the color of index 2 using image2 as a mask
    imP.save('out3.png', transparency = 0, optimize = 1) # Save and set index 0 as transparent
    

    【讨论】:

    • 根据您的问题,我认为您想要完整的 8 位透明度,而不是 1 种透明颜色。当然很简单!
    【解决方案2】:

    合并这两个图像后,您将不再有两种颜色 - 颜色将根据每个像素位置的每个颜色的透明度进行组合。最坏的情况是,您将拥有 256*256=65536 种颜色,这些颜色无法编入索引,并且如果这样做也不会很好地压缩。

    我建议保存为 PNG,让无损压缩发挥最大作用。

    【讨论】:

    • 嗯,我可以制作具有透明背景且仅索引一种颜色的图像吗?
    • @Tickon,PIL 将允许您在PA 模式下创建图像,但它不会让您保存它。我真的认为你应该将它保存为RGBA,如果你真的需要它更小,请使用专用于该任务的实用程序。
    • 我找到了一种保存透明 P 模式图像的方法,请参阅我的答案。
    猜你喜欢
    • 1970-01-01
    • 2019-02-08
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    相关资源
    最近更新 更多