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

        最近在学数字图像处理,参考书籍为《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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是在 MFC 中创建一个与图像相关的设备上下文句柄(HDC)和位图对象。 让我逐行解释这段代码的含义: 1. `CRect rect(CPoint(0, 0), CPoint(m_pdoc->m_FollowImg.cols, m_pdoc->m_FollowImg.rows));` 这一行代码创建了一个矩形对象 `rect`,其左上角坐标为 (0, 0),右下角坐标为图像的宽度和高度。 2. `LPBYTE lpPixel;` 这一行定义了一个指向字节类型的指针 `lpPixel`,用于存储位图像素数据。 3. `LONG nWidth = m_pdoc->m_FollowImg.cols + 4 - m_pdoc->m_FollowImg.cols % 4;` 这一行计算了位图的宽度,确保每一行的像素数据对齐到4字节边界。 4. `LONG nHeight = m_pdoc->m_FollowImg.rows;` 这一行获取了图像的高度。 5. `BITMAPINFOHEADER bmiHeader = { sizeof(BITMAPINFOHEADER), nWidth, -nHeight, 1, 16, BI_RGB, 0, 0, 0, 0, 0 };` 这一行定义了一个位图信息头结构体 `bmiHeader`,用于描述位图的属性,包括大小、宽度、高度、颜色位数等。 6. `HDC hMemDC = CreateCompatibleDC(NULL);` 这一行创建了一个与当前屏幕兼容的设备上下文句柄(HDC),用于绘制位图。 7. `HBITMAP hMemBmp = CreateDIBSection(NULL, reinterpret_cast<BITMAPINFO *>(&bmiHeader), DIB_RGB_COLORS, reinterpret_cast<void **>(&lpPixel), NULL, 0);` 这一行创建了一个与设备上下文兼容的位图对象,并将其与 `lpPixel` 关联起来,用于存储像素数据。 8. `HGDIOBJ hOldBmp = SelectObject(hMemDC, hMemBmp);` 这一行将位图对象选入设备上下文,使得后续的绘制操作可以在位图上进行。 总的来说,这段代码的作用是创建一个与图像大小相匹配的位图对象,并为其分配内存,以便后续的绘制操作可以在该位图上进行。 希望能帮到你!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值