png24转换为png8
我想把输入的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