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