使用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计数器,但是它可以正常工作     
已邀请:
        警告:尚未检查以下代码,但是我认为这可以满足您的要求(如果我正确理解了所有内容):
import numpy as np
arr = np.fromstring(buff,dtype=np.uint16).astype(np.uint32)
arr = ((arr & 0xF800) << 16) + ((arr & 0x07E0) << 13) + ((arr & 0x001F) << 11) + 0xFF
return Image.frombuffer(\'RGBA\', (xdim,ydim), arr, \'raw\', \'RGBA\', 0, 1)
我正在将所有通道组合成行中所有位移的32位。最左边的8位是红色,接下来的8位是绿色,接下来的8位是蓝色,最后8个alpha。移位数字可能看起来有些奇怪,因为我合并了16位格式的移位。另外,我使用的是
frombuffer
,因为那我们想利用Numpy所使用的缓冲区,而不是先转换为字符串。 查看此页面可能会有所帮助。在我看来,这不是超级好,但是根据我的经验,PIL就是这样。该文档确实不是非常用户友好,实际上我经常会感到困惑,但是我不会自愿重写它,因为我使用的PIL很少。     
        如果您想适当地进行缩放,则可以使用PIL来解决您的问题。
FROM_5 = ((np.arange(32, dtype=numpy.uint16) * 255 + 15) // 31).astype(numpy.ubyte)
FROM_6 = ((np.arange(64, dtype=numpy.uint16) * 255 + 31) // 63).astype(numpy.ubyte)

data = numpy.fromstring(buff, dtype=numpy.uint16)
r = Image.frombuffer(\'L\', shape, FROM_5[data >> 11], \'raw\', \'L\', 0, 1)
g = Image.frombuffer(\'L\', shape, FROM_6[(data >> 5) & 0x3F], \'raw\', \'L\', 0, 1)
b = Image.frombuffer(\'L\', shape, FROM_5[data & 0x1F], \'raw\', \'L\', 0, 1)
return Image.merge(\'RGB\', (r, g, b))
    

要回复问题请先登录注册