我的Linux机器上运行了一个c / c ++程序,它加载了一个24位的位图,读取了两个标题,然后将图像数据存储到char *变量中。我已经通过将变量内容转储到原始二进制文件并将其与原始位图+偏移进行比较来验证这一点。我使用了来自HERE的代码并且未修改,并注意或重新排序为RGB和自下而上。
现在,如果我有一个坐标列表,如X,Y,Width,Height,我将它们转换为我的图像的字节偏移量?!
在MY CODE中,您会看到我正在计算一条扫描线的宽度和字形位置以找到Y,然后为每个y + 1添加一条扫描线。类似地,对于X,我一次迭代三个字节。最后我将这三个字节按顺序存储到我的临时字符数组中。
实际上我不需要像素数据,因为字形是0xFF或0x00而没有平滑。我把它包括在内以确保我的位数在哪里。
HERE是我正在使用的图片。
编辑:-------------------------------------------- < / p>
如下所述,我的数学有点夸张。将i,j,k循环中的行固定为:
tmpChar[i][j][k] = img.data[(((Y+j) * imgWidth) + (X + i)) * imgBPP + k];
至于我的程序输出HERE你可以看到它加载位图很好并且标题信息是正确的但是当我尝试显示tmpChar数组的内容时它全部为0xFF(我使用了一个带符号的int,所以0xFF = -1和0x00 = +0)
答案 0 :(得分:1)
图像内存中的布局是(忽略我可能已经反转了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];
答案 1 :(得分:0)
我猜像素在内存中以颠倒的顺序存储,与BMP file format一样:
通常,像素相对于正常图像“颠倒”存储 光栅扫描顺序,从左下角开始,从左侧开始 向右,然后从图像的底部到顶部逐行
所以你的代码可能正在读取错误的像素块。