2010-05-12 7 views
2

J'ai une chaîne qui est lue à partir d'une caméra d'apogée USB qui est une image en niveaux de gris 12 bits avec les 12 bits occupant chacun les 12 bits les plus bas de 16- mots de bits. Je veux créer un png de 8 bits à partir de cette chaîne en ignorant les 4 bits les plus bas.python convert 12 bits image codée dans une chaîne à 8 bits png

Je peux le convertir en une image 16 bits où les plus 4 bits sont toujours à zéro en utilisant PIL avec

import Image 

#imageStr is the image string 
#imageSize is the image size 

img=Image.fromstring("I", imageSize, imageStr, "raw", "I;16", 0,1) 
img.save("MyImage.png", "PNG") 

que je peux faire de toute façon quelque chose de similaire pour créer une image de 8 bits sans déballer complètement la chaîne faire de l'arithmétique et faire une nouvelle chaîne?

Edit: Wumps commentaire sur la conversion d'une image m'a donné une idée, et je l'ai fait par

img = img.point(lambda i: i * 16, "L") #shifts by 4 bits and converts to 8-bit image. 

Merci Wump

+0

comment voulez-vous le faire pour convertir un 8 bits PNG à un 4 bits un et conserver la palette ? –

Répondre

2

commentaire de Wump sur la conversion d'une image m'a donné une idée, et je l'ai fait par

#shifts by 4 bits and converts to 8-bit image 
img = img.point(lambda i: i * 16, "L") 

Merci Wump

1

La seule façon que je sais comment le faire serait:

data = numpy.fromstring(imageStr, numpy.uint16) 
data >>= 4 # shift out four bits 
data = numpy.array(data, dtype=numpy.uint8) 
img = Image.fromarray(data.reshape(imageSize)) 

En principe, PIL peut convertir des images de cette façon:

img = img.convert("L") 

Mais le problème est qu'il n'a aucun moyen de réduire la précision de 8 bits (AFAIK), donc tout sera coupé à 255 :)

Edit: supprimé conversion de chaîne intermédiaire, il va directement de numpy à PIL maintenant

Questions connexes