png24转换为png8

2 投票
3 回答
5761 浏览
提问于 2025-04-16 00:56

我想把输入的24位PNG图片转换成8位的,我试过用Imagemagick和Python的PIL库,但都没有成功。

比如说:

在Imagemagick中,我尝试用这样的命令来转换:

convert -depth 8 png24image.png png8image.png

然后我用Python尝试的方法是:

import Image
def convert_8bit(src, dest):
    """
    convert_8bit: String, String -> void.
    Converts the input image file into 8bit depth.
    """
    im = Image.open(src)
    if not im.mode == "P":
        im2 = im.convert("P", rgb2xyz)
        im2.save(dest)

但是Imagemagick根本没有处理这个图片,而Python的函数虽然把图片减少到了8位,但独特的颜色数量只有164,而不是256。Photoshop在把24位PNG图片转换成PNG8时,能把颜色数量保持在256。

谢谢!

编辑:

这是我需要的通过Photoshop将24位转换为8位PNG的输出

alt text http://img695.imageshack.us/img695/934/psout.png

这是通过我的Python函数转换的结果

alt text http://img638.imageshack.us/img638/6762/pythonout.png

3 个回答

0

ImageMagick 和 PIL 对 PNG8 格式的支持质量比较低。

如果想要获得最佳的质量和文件大小比例(而且还可以完全支持透明度),可以使用 pngquant2

pngquant *.png
0

我这样做(在PHP中使用Imagick):

$colors = min(255, $im->getImageColors());
$im->quantizeImage($colors, Imagick::COLORSPACE_RGB, 0, false, false );
$im->setImageDepth(8 /* bits */);
4

看起来在convert方法中的量化方式没有达到预期效果。你可以试试这个:

im2 = im.convert('RGB').convert('P', palette=Image.ADAPTIVE)

额外转换成RGB可能是多余的。我是从这个链接得到的提示:http://nadiana.com/pil-tips-converting-png-gif

撰写回答