Ayuda con python y RGB332 bytearray a imagen y vice versa para rom de fpga. Aupa gente, Estoy totalmente atascado con algo que me temo que cualquiera de vosotros podrá aclararme en 10 minutos, lanzo la pregunta y luego versión TL;DR. Problema: leer un string que representa valores hexa para cada pixel de una imagen (8bits de profundidad en formato RGB332 = 3 bits para rojo, 3 bits para verde y 2 bits para azul) y crear/visualizar la imagen. Al contrario, dada una imagen (posiblemente en formato != rgb332) crear el string hex de byte/pixel en formato rgb332. http://jqm.io/files/TMP/rom64_p11.coe No tengo problema en parsear el fichero(.coe es una ROM vga para una fpga), obtener el string y crear la imagen. Uso PIL (pillow) con Image.frombytes() y previamente bytes.fromhex() No tengo problema en a partir de esa imagen (creo un BMP indexado con una paleta creada por mi), recrear de nuevo el fichero original. http://jqm.io/files/TMP/rom64_p11.bmp Lo anterior requiere una paleta que creo yo. El problema es cuando el origen es una imagen (bmp u otro formato RGB 24 o RGBA o similar) cualquiera. http://jqm.io/files/TMP/Lenna.bmp Se convertir el formato y modo con PIL pero el problema parece ser la paleta, aunque incrusto la mia el resultado de la imagen recreada no es bueno. He creado un par de script de test, con un fichero original y test válidos e inválidos. Estoy casi seguro que el problema es la paleta, pero he probado varias cosas sín éxito, más detalles a continuación. http://jqm.io/files/TMP/testcoe.py.txt http://jqm.io/files/TMP/testbmp.py.txt --- TL;DR --- El origen es un fichero .coe de texto usado en Xilinx para configurar una memoria ROM de una FPGA. Básicamente tiene un vector de valores en hexa que representa cada pixel mediante un byte RGB332 = 3 bits para rojo, 3 bits para verde y 2 bits para azul. Leer el fichero y obtener el string no es problema, después con PIL (pillow) desde python genero un BMP o si quiero otros formatos sin problema. La imagen parece correcta, concretamente una carta de ajuste de TV de 64x64x8. A partir de esa imagen puedo regenerar el fichero .coe correctamente. En cambio si trabajo con otro BMP, no consigo una imagen (un .coe que regenere la imagen) de 8 bits rgb332 fiel a la original. Os dejo: - El fichero original .coe: http://jqm.io/files/TMP/rom64_p11.coe - Un script para parsear el .coe: http://jqm.io/files/TMP/testcoe.py.txt - Un script para probar imágenes bmp: 1º obtener los datos de imagen img.getdata() 2º crear el string que representa los bytes (para crear el fichero .coe, aunque en el testbmp.py lo que haga sea visualizar la imagen) 3º crear imagen en modo 'P' (8bits/pixel) a partir de ese string 4º incrustar mi paleta 5º visualizar la imagen para comprobar (se ven la original y las creadas) http://jqm.io/files/TMP/testbmp.py.txt un bmp creado por mi ok: http://jqm.io/files/TMP/rom64_p11.bmp un bmp que no consigo pasar a .coe: http://jqm.io/files/TMP/Lenna.bmp - El script completo de lo que quiero hacer: la idea es que sea cli y gui http://jqm.io/files/TMP/coetool.py.txt He intentado usar la librería para crear la imagen desde los bytes, crear una imagen nueva vacía y clonar sobre esa la que quiero obtener, he probado a transformar primero con ImageMagick para tener un bmp como el que necesito... () pero nada... http://stackoverflow.com/questions/3114925/pil-convert-rgb-image-to-a-specific-8-bit-palette http://www.imagemagick.org/Usage/quantize/#332_colormap http://www.imagemagick.org/Usage/quantize/#od_posterize http://pillow.readthedocs.org/en/latest/handbook/concepts.html http://pillow.readthedocs.org/en/latest/reference/Image.html#constructing-images ... también he hecho alguna prueba con Gimp a mano... Si por ejemplo uso una paleta en plan generada: palette_test = [] for i in range(0, 256): palette_test.append(0) palette_test.append(i) palette_test.append(0) en ambos sentidos, al generar el coe y al regenerar la imagen, entonces la imagen se mantiene fiel siempre, pero claro, sólo con canal verde. Parece ser un problema con la paleta, pero como os digo he hecho pruebas tanto desde python como con ImageMagick y no consigo... A ver si no me caen muchos "lamerazo!" y me desatascáis... .