CImage类提供了GetBits()函数原理及实现

时间:2023-03-09 13:06:05
CImage类提供了GetBits()函数原理及实现
CImage类提供了GetBits()函数来读取数据区,GetBits()函数返回的是图片最后一行第一个像素的地址,
网上有人说返回指针的起始位置是不同的,有些图片返回的是左上角像素的地址,有些是左下角像素的地址,跟图片内部顺序有关。
GetPitch( ) 图像的间距。 如果返回值为负,位图是一个从下到上 DIB,并且原点是左下角。 如果返回值为正的,位图是一组 DIB,并且原点为左上角
两个函数GetPitch()和GetHeight()一起使用就可以得到图片数据取得起始位置 img_Data=(BYTE *)m_Image.GetBits()+(m_Image.GetPitch()*(m_Image.GetHeight()-1)); 这样,img_Data就是图片数据区的起始位置,这个公式是从codeproject里看到的,介绍的很精辟,可以从google里搜索到。
其中GetHeight()函数返回图片的高度(以像素为单位)。GetPitch()返回图像的斜度,如果图像的顺序是从下到上(也就是GetBits()返回左上角像素的地址),
这时GetPitch()返回一个负值,大小为图像宽所占有的字节数,例如24位800*600的图片,返回值应该是正或负的800*3。
这样用每一行的字节数乘行数就可以得到起始位置了。

函数getbits(x,p,n),返回x中从右边数第p位开始向右数n位的字段。

这里假设最右边的一位是第0位,n与p都是合理的正值。

例如getbits(x,4,3)返回x中的第4、3、2三位的值。

下面给出通过位运算的实现方法:

unsigned getbits(unsigned x,int p,int n)
{
return (x>>(p+1-n))&~(~0<<n);
}

其中,表达式x>>(p+1-n)将期望获得的字段移动到字的最右端,~0的所有位都为1,

这里使用语句~0<<n将~0左移n位,并将最右边的n位用0填补。再使用~运算符对它

按位取反,这样就建立了最右边n位全为1的屏蔽码。