使用numpy和pil将565(16位颜色)转换为888(24位颜色)
我必须以我有一个使用bitshift和putpixel的工作方法为前提,但是它确实非常慢,而且我希望利用numpy来加快该过程。我相信我很亲近,但还不完全到那儿。设定好我认为应该工作的时间后,我看到时间有了0.3秒的改善,因此我的动力也得到了提高。
当前的工作代码:
buff # a binary set of data
im = Image.new(\"RGBA\",(xdim,ydim))
for y in xrange(ydim):
for x in xrange(xdim):
px = buff[x*y]
# the 255 is for the alpha channel which I plan to use later
im.putpixel((x,y),(px&0xF800) >> 8, (px&0x07E0) >> 3, (px&0x001F) <<3, 255))
return im
我试图开始工作的代码如下所示:
im16 = numpy.fromstring(buff,dtype=numpy.uint16) #read data as shorts
im16 = numpy.array(im16,dtype=numpy.uint32) #now that it\'s in the correct order, convert to 32 bit so there is room to do shifting
r = numpy.right_shift(8, im16.copy() & 0xF800)
g = numpy.right_shift(3, im16.copy() & 0x07E0)
b = numpy.left_shift( 3, im16 & 0x001F)
pA = numpy.append(r,g)
pB = numpy.append(b,numpy.ones((xdim,ydim),dtype=numpy.uint32) * 0xFF) #this is a black alpha channel
img = numpy.left_shift(img,8) #gives me green channel
im24 = Image.fromstring(\"RGBA\",(xdim,ydim),img)
return im24
所以最后一个问题是通道没有合并,我不认为我必须进行最后的位移(请注意,如果我不将位移位8,我会得到红色通道)。对于如何正确组合所有内容的帮助将不胜感激。
解
import numpy as np
arr = np.fromstring(buff,dtype=np.uint16).astype(np.uint32)
arr = 0xFF000000 + ((arr & 0xF800) >> 8) + ((arr & 0x07E0) << 5) + ((arr & 0x001F) << 19)
return Image.frombuffer(\'RGBA\', (xdim,ydim), arr, \'raw\', \'RGBA\', 0, 1)
区别在于您需要从putpixel直观地将其打包为MSB(ALPHA,B,G,R)LSB计数器,但是它可以正常工作
没有找到相关结果
已邀请:
2 个回复
坝镰补翔奋
我正在将所有通道组合成行中所有位移的32位。最左边的8位是红色,接下来的8位是绿色,接下来的8位是蓝色,最后8个alpha。移位数字可能看起来有些奇怪,因为我合并了16位格式的移位。另外,我使用的是
,因为那我们想利用Numpy所使用的缓冲区,而不是先转换为字符串。 查看此页面可能会有所帮助。在我看来,这不是超级好,但是根据我的经验,PIL就是这样。该文档确实不是非常用户友好,实际上我经常会感到困惑,但是我不会自愿重写它,因为我使用的PIL很少。
旅牢斯讲