如何将仅含0/255的RGBA黑白图像字节数组转换为按位存储的二进制数组
RGBA黑白数组转单比特像素数组方案
需求说明
输入为仅包含255或0的字节数组,对应RGBA格式的黑白图像,需要转换为每个比特位对应1个像素的压缩字节数组。
示例输入:[255, 255, 255, 255, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
示例输出:
二进制10111111对应字节数组[191]
实现逻辑
- 提取像素值:RGBA格式每个像素占4个字节(R、G、B、A顺序),黑白图像同一像素的R/G/B取值一致,每4个输入元素取第一个值作为该像素的亮度值
- 比特映射:
255对应比特位1,0对应比特位0 - 字节拼接:每8个比特按高位到低位的顺序拼接为1个输出字节,不足8位的末尾补0凑整
Python 实现代码
def rgba_to_bit_packed(rgba_array): # 提取每个像素的R通道值 pixels = [rgba_array[i] for i in range(0, len(rgba_array), 4)] result = [] current_byte = 0 bit_pos = 7 # 从最高位开始填充 for pixel in pixels: if pixel == 255: current_byte |= (1 << bit_pos) bit_pos -= 1 # 凑够8位存入结果数组 if bit_pos < 0: result.append(current_byte) current_byte = 0 bit_pos = 7 # 处理剩余不足8位的情况 if bit_pos != 7: result.append(current_byte) return result # 测试示例 test_input = [255,255,255,255, 0,0,0,255, 255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255] print(rgba_to_bit_packed(test_input)) # 输出 [191]
示例验证
- 32位输入共对应8个像素,提取后像素序列为
[255, 0, 255, 255, 255, 255, 255, 255] - 映射为比特序列(从高位到低位):
1 0 1 1 1 1 1 1 - 转换为十进制:
1*128 + 0*64 +1*32 +1*16 +1*8 +1*4 +1*2 +1*1 = 191,和示例输出完全匹配
内容的提问来源于stack exchange,提问作者user5507535
相关产品推荐
相关产品推荐

