1<<(7-x%8) & *(LPBYTE)(m_lpImage+GetPixelOffset(x, y))的理解

来源:互联网 发布:卫宫切嗣的理念知乎 编辑:程序博客网 时间:2024/05/23 00:41

        最近在学数字图像处理,参考书籍为《Visual C++数字图像获取、处理及实践应用》,在学习到第二章DIB类中的GetPixel(int x, int y)函数时遇到了问题,经过自己的专研终于解决了,下面与大家分享一下。

首先函数GetPixelOffset(x, y)代码如下:

LONG CDib::GetPixelOffset(int  x, int y)
{
CSize sizeSaveDim;
sizeSaveDim = GetDibSaveDim();


LONG lOffset = (LONG) (sizeSaveDim.cy - y - 1) * sizeSaveDim.cx +
x  / (8 / m_lpBMIH->biBitCount);
return lOffset;
}

        该函数用于获取像素坐标为(x,y)在以数据块起始位置为基点的位置(单位是字节),注意这里的坐标值是从上到下,从左到右来计算的,是以1开始计数的;而数据在存储时的顺序是从下到上,从左到右的,并且是以0开始的。比如对于一个9×8的图像(2,3)在内存中跨越的整数行为9-3-1=5,多出的字节数为2/(8/1)=0(这里以每个像素占1bit为例),故偏移的字节数为5*sizeSaveDim.cx+0,也就是说(2,3)实际上是在内存中的第六行,第一个字节中存储着的。

        回到正题,*(LPBYTE)(m_lpImage+GetPixelOffset(x, y)) 实际上表示的是某个像素所处的字节的值,1<<(7-x%8)表示将00000001左移5位(x=2)得到:00100000,1恰好指向像素所在的位置,最后       1<<(7-x%8) & *(LPBYTE)(m_lpImage+GetPixelOffset(x, y))    表示某个字节也00100000按位与,准确得到某个像素的值。

0 0