2010-07-07 238 views
2

我想将输入的24位PNG图像转换为8位,我曾尝试使用Imagemagick和Python PIL,都不起作用。png24 to png8转换

例如:

在ImageMagick的我尝试转换控制台命令这样:

convert -depth 8 png24image.png png8image.png 

这里是我与蟒蛇试图方式:

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时,Photoshop使用256位数字将图像转换为8位从24位png图像转换为png8。

由于

编辑:通过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

你是什么意思“甚至没有触及形象”究竟是什么意思? “png8image.png”是否完全不被创建? – 2010-07-07 14:06:38

+0

创建但没有区别(只是与另一个名称相同的副本) – Hellnar 2010-07-07 14:08:58

+0

*你好我想将输入的24位PNG图像转换为8位,我已经通过Imagemagick和Python PIL尝试过,但都没有作用。*应该是*我想要将输入的24位PNG图像转换为8位。我曾尝试使用Imagemagick和Python PIL,但都无效。* – mcandre 2010-07-07 14:09:57

回答

3

它看起来像在convert方法的量化方法是不是做正确的事。试试这个:

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

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

+0

我有一个印象,没有'调色板= Image.ADAPTIVE'参数,PIL只使用“网络安全”的颜色。 – tzot 2010-08-05 23:27:36

+0

@ΤΖΩΤΖΙΟΥ,是的,我想我在文档的某处看到了这一点。再也没有理由使用网络安全的颜色了 - 这是图形适配器能力差得多的时候。它会导致画面看起来很糟糕,而且压缩也较少! – 2010-08-06 03:41:34

0

我不喜欢这样(在PHP中使用Imagick):

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

我使用python,并具有非常有限的PHP知识,因此转换命令版本这将是可爱的:) – Hellnar 2010-07-07 14:18:28