python将字符串编码的12位图像转换为8位png

时间:2010-05-12 04:32:21

标签: python image bits

我有一个从usb apogee相机读取的字符串,它是一个12位灰度图像,每个12位占据16位字的最低12位。 我想通过忽略最低的4位来从这个字符串创建一个8位的png。

我可以将它转换为16位图像,其中最高4位始终为零,使用PIL和

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")

无论如何,我可以做类似的事情来创建一个8位图像,而不是完全解包字符串做算术和制作新字符串吗?

编辑:Wumps关于转换图像的评论给了我一个想法,我是通过

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

谢谢Wump

2 个答案:

答案 0 :(得分:2)

Wump关于转换图片的评论给了我一个想法,我是通过

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

谢谢Wump

答案 1 :(得分:1)

我知道如何做的唯一方法是:

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))

在principe中,PIL可以通过这种方式转换图像:

img = img.convert("L")

但问题是它无法将精度降低到8位(AFAIK),因此所有内容都将被剪裁为255:)

编辑:删除了中间字符串转换,它现在直接从numpy转到PIL