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?

È stato utile?

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top