PIL: convertire l'immagine RGB a una specifica gamma di colori 8-bit?
Domanda
Uso della Python Imaging Library, posso chiamare
img.convert("P", palette=Image.ADAPTIVE)
o
img.convert("P", palette=Image.WEB)
, ma c'è un modo per convertire in una tavolozza arbitrario?
p = []
for i in range(0, 256):
p.append(i, 0, 0)
img.convert("P", palette=p)
dove ti mappa ogni pixel per il colore più vicino trovato nell'immagine? O è questo supportato per Image.WEB
e nient'altro?
Soluzione
Mentre si guarda attraverso il codice sorgente di convert()
ho visto che fa riferimento im.quantize
.
quantize
può prendere un argomento tavolozza. Se si fornisce un'immagine che ha una gamma di colori, questa funzione prenderà quella tavolozza e applicarlo 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.
Altri suggerimenti
Il ImagePalette
modulo di docs primo esempio mostra come allegare un palette 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()