2010-06-25 13 views
7

Utilizzando il Python Imaging Library, posso chiamarePIL: Converti l'immagine RGB in una tavolozza a 8 bit specifica?

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

o

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

ma c'è un modo per convertire in una tavolozza arbitraria?

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

dove mapperà ogni pixel al colore più vicino trovato nell'immagine? O è supportato per Image.WEB e nient'altro?

risposta

4

Guardando attraverso il codice sorgente di convert() ho visto che fa riferimento im.quantize. quantize può richiedere un argomento di tavolozza. Se fornisci un'immagine con una tavolozza, questa funzione prenderà quella tavolozza e la applicherà all'immagine.

Esempio:

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

L'altra risposta fornita non ha funzionato per me (lo ha fatto alcune davvero male conversione tavolozza doppia o qualcosa del genere), ma questa soluzione ha fatto.

2

Il primo ImagePalettemodule docs's esempio mostra come collegare una tavolozza a un'immagine, ma che immagine deve essere già di modalità "P" o "L". Si può, tuttavia, adattare l'esempio per convertire un immagine full RGB ad una tavolozza di vostra scelta:

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

Hai provato questo? –

+0

Sono abbastanza sicuro di averlo fatto in quel momento (~ 5 anni fa). Non ha funzionato per te? –

+1

Non ci ho provato. Ho finito usando im.quantize() –