2010-06-25 16 views
7

die Python Imaging Library verwenden, kann ichPIL: RGB-Bild in eine bestimmte 8-Bit-Palette konvertieren?

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

oder

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

nennen, aber ist es eine Möglichkeit, eine beliebige Palette zu konvertieren?

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

wo wird jedes Pixel auf die nächste Farbe im Bild zugeordnet? Oder wird dies für Image.WEB unterstützt und nichts anderes?

Antwort

4

Während durch den Quellcode von convert() Suche ich sah, dass es im.quantize verweist. quantize kann ein Palettenargument annehmen. Wenn Sie ein Bild mit einer Palette bereitstellen, übernimmt diese Funktion diese Palette und wendet sie auf das Bild an.

Beispiel:

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

Die andere bereitgestellt Antwort nicht für mich arbeiten (es hat einige wirklich schlechte Doppel Palette Wandlungs- oder etwas), aber diese Lösung hat.

2

Die ImagePalettemodule docs's erste Beispiel zeigt, wie eine Palette auf ein Bild anhängen, aber das Bild ist schon von Mode "P" oder "L" sein muss. Man kann jedoch paßt das Beispiel ein vollständiges RGB-Bild auf eine Palette Ihrer Wahl zu konvertieren:

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

Haben Sie das getestet? –

+0

Ich bin mir ziemlich sicher, dass ich damals (vor 5 Jahren). Hat es nicht für dich funktioniert? –

+1

Ich habe es nicht versucht. Ich habe mit im.quantize() abgewickelt –