2010-06-25 28 views
7

Uso de la biblioteca Python Imaging, puedo llamarPIL: ¿Convertir imagen RGB a una paleta específica de 8 bits?

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

o

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

pero ¿hay una manera de convertir a una paleta arbitraria?

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

donde asignará cada píxel al color más cercano encontrado en la imagen? ¿O es compatible con Image.WEB y nada más?

Respuesta

4

Mientras mira a través del código fuente de convert() vi que se hace referencia im.quantize. quantize puede tomar un argumento de paleta. Si proporciona una Imagen que tiene una paleta, esta función tomará esa paleta y la aplicará a la imagen.

Ejemplo:

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

La otra respuesta proporcionada no funcionó para mí (lo hizo muy malas conversión doble paleta o algo así), pero esta solución hizo.

2

El ImagePalettemodule docs's primer ejemplo muestra cómo fijar una paleta de una imagen, pero esa imagen ya debe ser de modo "P" o "L". Uno puede, sin embargo, adaptar el ejemplo para convertir una imagen RGB completo a una paleta de su elección:

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

¿Has probado esto? –

+0

Estoy bastante seguro de haberlo hecho en ese momento (~ 5 años atrás). ¿No funcionó para ti? –

+1

No lo intenté. Terminé usando im.quantize() –

Cuestiones relacionadas