我有一个图像数据的二进制文件,其中每个像素正好是 4 位。图像数据布局如下:
有 N 张图片,第一张图片是 1x1,第二张图片是 2x2,第三张图片是 4x4,依此类推(如果您想知道的话,它们是 mipmap)。
给定一个指向数据缓冲区开始的指针,我想跳到最大的图像。
现在我知道我想跳过多少字节,但在开始时有一个烦人的 1x1 图像,它是 4 位。反正我不知道要逐位递增指针。
我怎样才能成功检索数据,而不会所有内容都关闭 4 位?
最佳答案
假设您可以更改文件格式,您可以执行以下任一操作:
- 向 1x1 图像添加填充
- 以相反的顺序存储图像(与上面的效果相同,但对于 mip-maps 并不理想,因为您不一定知道您将拥有多少图像)
如果您无法更改格式,您有以下选择:
- 转换数据
- 接受缓冲区偏移半个字节并相应地使用它
你说:
How can I successfully retrieve the data without everything being off by 4 bits?
所以这意味着您需要转换。当您以字节为单位计算偏移量时,您会发现第一个包含前一个图像的半个字节。所以在紧要关头你可以像这样洗牌:
for( i = start; i < end; i++ ) {
p[i] = (p[i] << 4) | (p[i+1] >> 4);
}
假设第一个像素是第 4-7 位,第二个像素是第 0-3 位,依此类推...如果情况相反,只需反转这两个移位即可。
关于c++ - 二进制文件位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14885068/