我有一个 c/c++ 程序在我的 Linux 机器上运行,它加载一个 24 位位图,读取两个 header ,然后将图像数据存储到一个 char* 变量中。我已经通过将变量内容转储到原始二进制文件并将其与原始位图+偏移量进行比较来验证这项工作。我使用了 HERE 中的代码并且未修改并注意或重新排序为 RGB 并自下而上。
现在,如果我有一个坐标列表,例如 X、Y、宽度、高度,我到底该如何将它们转换为图像的字节偏移量?!
在MY CODE您看到我正在计算一条扫描线的宽度和字形位置以找到 Y,然后为每个 y+1 添加一条扫描线。类似地,对于 X,我一次迭代三个字节。最后,我将这三个字节按顺序存储到我的临时字符数组中。
事实上,我不需要像素数据,因为字形是 0xFF 或 0x00,没有进行平滑处理。我将其包括在内是为了确保我的位被计算在内。
HERE是我正在使用的图像。
编辑:----------------------------------------
如下所述,我的数学有点古怪。将 i,j,k 循环中的行固定为:
tmpChar[i][j][k] = img.data[(((Y+j) * imgWidth) + (X + i)) * imgBPP + k];
至于我的程序输出 HERE如您所见,它可以很好地加载位图并且 header 信息是正确的,但是当我尝试显示 tmpChar 数组的内容时,它的所有内容都是 0xFF(我使用了一个带符号的 int,所以 0xFF = -1 和 0x00 = +0)
最佳答案
图像在内存中的布局是(忽略我可能已经颠倒了 R、G 和 B):
[R of pixel 0] [G of pixel 0] [B of pixel 0] ....... [B of (0, imgWidth-1)] [R of pixel (1, 0)] .....
因此要计算任何给定像素的偏移量:offset = ((Y * imgWidth) + X) * imgBPP + colorByte
。
据我所知,假设你的角色 X 和 Y 是正确的:
tmpChar[i][j][k] = img.data[(((Y+j) * imgWidth) + (x + i)) * imgBPP + k];
关于c++ - 对位图图像使用 X、Y 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13781203/