Problemas al cargar imagen con PIL

Francisco José Seva Mora franciscojseva en gmail.com
Mie Mayo 30 23:09:45 CEST 2007


Hola a todos.
Hace poco escribí comentando que tenía problemas leer los bytes de una
imagen en un archivo DICOM, al día siguiente, gracias a Gabriel. G. todo
estaba resuelto. Resumiendo un poco, resultad que después de leer los bytes
correspondientes  a la imagen y de tratarlos, paso a mostrar la imagen. Pués
aquí es donde me pierdo un poco con la PIL. Para mostrar la imagen uso la
función Imagen.frombuffer (o Imagen.fromstring) y le paso como parámetro, el
tamaño, los datos de la imagen y el formato, es decir, si es RGB, si tiene
alfa (ARGB) si es de 16 bits..etc.

Para el caso de una imagen RGB, me encuentro por un lado que al cargar la
imagen no me acepta el modo "RGB", sale el siguiente mensaje " not enough
image data ", lo que me lleva a pensar que los datos que leo no son los
correctos, me falta información.

Por otro lado, en vez de usar RGB uso el modo "P" que es para 8 bits y si
que se muestra la imagen.

No se si me estoy equivocando a la hora de tomar los bytes y tratar los bits
o en la forma de cargar las imágenes.

Os pongo aquí el codigo por os sirve :

# tratamiento de los bytes leidos de una imagen RGB de un archivo DICOM
     if (self.__dataDic.hasTag('(0028,0004)') and

str(self.__dataDic.getTreatValue('(0028,0004)')).strip()=='RGB'):

                print' la imagen es RGB'
                self.__Rgb = True
                for i in range(self.__width*self.__height):
                   self.__data.insert(i,(
                                       (0xff & img[3*i]      << 16) |
                                       (0xff & img[(3*i)+1]  << 8) |
                                       (0xff & img[(3*i)+2]   ) )  )

Como veis supongo que la imagen es RGB de 24 bits. Se que hay muchos casos
en los que la imagen RGB viene con 32 bits de los cuales los 8 bits mas
pesados no se usan y en el caso de que se usaran la imagen seria RGBA (que
un caso a tener encuenta por ahora). Por lo poco que se sobre RGB es que
para el caso de 32 bits habría que hacer los siguiente :

                                       (0xff <<24)                       |
                                       (0xff & img[3*i]      << 16) |
                                       (0xff & img[(3*i)+1]  << 8) |
                                       (0xff & img[(3*i)+2]   ) )  )
Pero da un error, el desplazamiento de 24 bits a 0xff se sale del valor de
un entero y python no te deja seguir. Esto mismo lo he hecho en java y si
que funciona

#Codigo para mostrar crear la imagen :

# este no funciona
imagen=Image.frombuffer('RGB',(self.__width,self.__height),self.__data,"raw","RGB",0,1)


#este SI funciona
imagen=Image.frombuffer('P',(self.__width,self.__height),self.__data,"raw","P",0,1)


¿dónde pensais que estoy metiendo la pata?

Os adjunto algunas imágenes que obtengo
imagenLittleImplicit.bmp---->esta es la supuesta imagen RGB que se carga con
el modo "P"
imagen1.png                ----->lo que deberia verse y no se ve


Un abrazo a todos.


blog: www.lacoctelera.com/nupi
------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


Más información sobre la lista de distribución Python-es