我有一个二进制格式的img。 每个像素为10位。
它们被连续推入,就像第一个字节中的[9-2]和第二个字节中的[1:0]。 其中9 IS MSB位,0-LSB。 如何将它们转换为16bit数组?
例如: 像8位一样存储:
0b10000011,
0b10101100,
0b10011001,
0b11000000,
0b10101000,
包含实际像素的实际数据,我想将其转换为16位:
0b1000001110,
0b1011001001,
0b1001110000,
0b0010101000,
答案 0 :(得分:2)
似乎您想像这样转换数据
img[0] = AAAAAAAA
img[1] = AABBBBBB
img[2] = BBBBCCCC
img[3] = CCCCCCDD
img[4] = DDDDDDDD
对这样的数据:
array[0] = 000000AAAAAAAAAA
array[1] = 000000BBBBBBBBBB
array[2] = 000000CCCCCCCCCC
array[3] = 000000DDDDDDDDDD
可以这样做:
array[0] = ((img[0] << 2) | (img[1] >> 6)) & 0x3ff;
array[1] = ((img[1] << 4) | (img[2] >> 4)) & 0x3ff;
array[2] = ((img[2] << 6) | (img[3] >> 2)) & 0x3ff;
array[3] = ((img[3] << 8) | img[4] ) & 0x3ff;
要转换多个块,for循环很有用,如下所示:
for (int i = 0; (i + 1) * 5 <= num_of_bytes_in_img; i++) {
array[i * 4 + 0] = ((img[i * 5 + 0] << 2) | (img[i * 5 + 1] >> 6)) & 0x3ff;
array[i * 4 + 1] = ((img[i * 5 + 1] << 4) | (img[i * 5 + 2] >> 4)) & 0x3ff;
array[i * 4 + 2] = ((img[i * 5 + 2] << 6) | (img[i * 5 + 3] >> 2)) & 0x3ff;
array[i * 4 + 3] = ((img[i * 5 + 3] << 8) | img[i * 5 + 4] ) & 0x3ff;
}
(此循环不会转换最后几个字节,因此您应单独对待它们或在使用img结束图像时在img上添加填充,以免超出范围)