我有一个从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
答案 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