2010-07-07 95 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