gpt4 book ai didi

python - 使用 numpy 和 pil 将 565(16bit-color) 转换为 888(24bit-color)

转载 作者:太空宇宙 更新时间:2023-11-04 11:01:00 26 4
gpt4 key购买 nike

我必须先说明这一点,事实上我有一个使用 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

所以最后一个问题是, channel 没有合并,我认为我不应该做最后的位移(请注意,如果我不位移 8,我会得到红色 channel )。非常感谢有关如何正确组合所有内容的帮助。

解决方案

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)

不同之处在于您需要将它打包为 MSB(ALPHA,B,G,R)LSB 与 putpixel 的直觉相反,但它确实有效,而且效果很好

最佳答案

警告:尚未检查以下代码,但我认为这将执行您想要的操作(如果我理解正确的话):

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)

我正在将所有 channel 组合成 32 位的线路,完成所有的位移位。最左边的 8 位是红色,接下来的 8 位是绿色,接下来的 8 位是蓝色,最后 8 位是 alpha。移位数字可能看起来有点奇怪,因为我合并了 16 位格式的移位。此外,我正在使用 frombuffer,因为我们想利用 Numpy 使用的缓冲区,而不是先转换为字符串。

查看 this page 可能会有所帮助.在我看来,这不是很好,但根据我的经验,PIL 就是这样。该文档确实不是很用户友好,事实上我经常觉得它很困惑,但我不会自愿重写它,因为我不经常使用 PIL。

关于python - 使用 numpy 和 pil 将 565(16bit-color) 转换为 888(24bit-color),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5414638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com