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按位与,准确得到某个像素的值。
- 1<<(7-x%8) & *(LPBYTE)(m_lpImage+GetPixelOffset(x, y))的理解
- 对(x&y)+((x^y)>>1)的理解
- 【学习笔记】对 (x&y) + ( (x^y)>>1 ) 的理解
- (x&y)+((x^y)>>1)
- (x&y)+((x^y)>>1)
- (x&y)+((x^y)>>1)
- (x&y)+((x^y)>>1)
- (x&y)+((x^y)>>1)
- $$x^y+y^x>1$$
- 新手喜闻乐见的x++,y++,++x,++y
- (x&y) + ( (x^y)>>1 )证明
- (x&y) + ( (x^y)>>1 )证明
- (x&y)+((x^y)>>1)用法
- (x&y) + ( (x^y)>>1 )证明
- return (x&y)+((x^y)>>1 ) 解释
- (x&y) + ( (x^y)>>1 )证明
- (x&y) + ( (x^y)>>1 )证明
- (x&y) + ( (x^y)>>1 )求平均值
- HDU 1517 A Multiplication Game(SG博弈变形)
- Android ListView实现不同类型的item
- 设计模式-适配器模式
- 四叉树
- Android中的webview调用第三方支付
- 1<<(7-x%8) & *(LPBYTE)(m_lpImage+GetPixelOffset(x, y))的理解
- Android开发之流式标签布局
- 关于mysql四个默认数据库
- Session的生命周期
- Set
- Grails中Domain对象的事务控制及同一对象的重复提交
- Cutting Sticks(砍棍子,区间DP)
- 滑动删除
- 基于JSP + servlet + javabean的MVC简单验证登录实例