2010-06-25 166 views
7

使用Python圖像庫,我可以叫PIL:將RGB圖像轉換爲特定的8位調色板?

img.convert("P", palette=Image.ADAPTIVE) 

img.convert("P", palette=Image.WEB) 

但有一種方式轉換爲任意調色盤嗎?

p = [] 
for i in range(0, 256): 
    p.append(i, 0, 0) 
img.convert("P", palette=p) 

它將映射每個像素到圖像中找到的最接近的顏色?或者,這是支持Image.WEB,沒有別的?

回答

4

雖然翻翻的convert()的源代碼,我看到它引用im.quantizequantize可以採用調色板參數。如果您提供具有調色板的圖像,則此功能將採用該調色板並將其應用於圖像。

例子:

src = Image.open("sourcefilewithpalette.bmp") 
    new = Image.open("unconvertednew24bit.bmp") 
    converted = new.quantize(palette=src) 
    converted.save("converted.bmp") 

另提供答案並沒有爲我工作(它做了一些非常糟糕的雙色調轉換或什麼的,)但是這種解決方案做到了。

2

ImagePalettemodule docs's第一個示例顯示如何將調色板附加到圖像,但該圖像必須已經是模式"P""L"。一個也可以,但是,適應的例子,以一個完整的RGB圖像轉換成您所選擇的調色板:

from __future__ import division 
import Image 

palette = [] 
levels = 8 
stepsize = 256 // levels 
for i in range(256): 
    v = i // stepsize * stepsize 
    palette.extend((v, v, v)) 

assert len(palette) == 768 

original_path = 'original.jpg' 
original = Image.open(original_path) 
converted = Image.new('P', original.size) 
converted.putpalette(palette) 
converted.paste(original, (0, 0)) 
converted.show() 
+0

你測試過了嗎? – 2015-02-16 23:07:18

+0

我很確定我在當時(〜5年前)做過。它不適合你嗎? – 2015-02-16 23:46:05

+1

我沒有嘗試。我用im.quantize()結束了 – 2015-02-17 21:05:05