png24到png8的转换

时间:2010-07-07 14:03:08

标签: python image png imagemagick

我想将输入的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)

当python函数减少到8位时,Imagemagick甚至没有触摸图像,但保留了唯一数字164的数量而不是256.当从24位png图像转换为png8时,Photoshop用于将图像转换为8位,带有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 :(得分:3)

看起来convert方法上的量化方法做得不对。试试这个:

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

额外转换为RGB可能是多余的。我从http://nadiana.com/pil-tips-converting-png-gif

得到了这个提示

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

ImageMagick和PIL有low quality PNG8 support

为获得最佳质量/文件大小比例(以及作为奖励的完整Alpha支持),请使用pngquant2

pngquant *.png