使用 pypng 将 24 位 PNG 文件转换为 8 位颜色索引图像

tsn*_*y17 2 png image-processing python-3.x pypng

我正在尝试编写一个 python 脚本,该脚本接受标准 24 位 png 并将其转换为 8 位 png 以实现更好的压缩。看起来 pypng 可以做到这一点,但我不太清楚如何使用它。图像处理对我来说是一个新领域,所以这可能看起来很愚蠢。我目前有这个:

r=png.Reader(<myfile>)
test = r.asRGBA8()

Run Code Online (Sandbox Code Playgroud)

这给了我元组作为回报(我相信图像的层)。但是我似乎无法将其写入或保存回图像。我缺少什么?这是测试图像

Mar*_*ell 5

原答案

我认为这符合你的要求:

from PIL import Image

# Load image
im = Image.open('logo.png')                                                                 

# Convert to palette mode and save
im.convert('P').save('result.png')
Run Code Online (Sandbox Code Playgroud)

更新答案

我找不到一种方法让 PIL 制作出合理的调色板图像,但可以通过其他几种方法来做到这一点......

要么wand像这样:

#!/usr/bin/env python3

from wand.image import Image

with Image(filename='logo.png') as img: 
    img.quantize(number_colors=256, colorspace_type='lab', treedepth=0, dither=False, measure_error=False)
    img.save(filename='result.png')
Run Code Online (Sandbox Code Playgroud)

或者,通过在命令行中调用ImageMagick并执行以下操作:

magick logo.png -colors 255 png8:logo8.png      # use "convert" in place of "magick" if using v6
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

最新答案

好吧,我找到了一种让 PIL/Pillow 做得更好的方法,正如预期的那样,它利用了libimagequantPillow 通常不内置的功能(至少在我所在的 macOS 上)。代码如下所示:

#!/usr/bin/env python3

from PIL import Image

# Load image
im = Image.open('logo.png')                                                                 

# Convert to palette mode and save. Method 3 is "libimagequant"
im.quantize(colors=256, method=3).save('result.png')
Run Code Online (Sandbox Code Playgroud)

在 macOS 上构建 PIL/Pillow 的步骤libimagequant如下 - 它们在其他平台上会有所不同,但您应该能够了解总体思路并进行调整:

pip uninstall pillow           # remove existing package
brew install libimagequant
brew install zlib
export PKG_CONFIG_PATH="/usr/local/opt/zlib/lib/pkgconfig"
pip install --upgrade Pillow --global-option="build_ext" --global-option="--enable-imagequant" --global-option="--enable-zlib"
Run Code Online (Sandbox Code Playgroud)

关键词:Python、图像处理、PIL/Pillow、libimagequant、macOS、量化、量化。