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

Posted Good Good Study~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的屏蔽码。

以上是关于CImage类提供了GetBits()函数原理及实现的主要内容,如果未能解决你的问题,请参考以下文章

c++利用StretchBlt函数改变CImage输出图片的位置

c++利用StretchBlt函数改变CImage输出图片的位置

图片数据随笔

ATL 中的 CImage 类

VC++如何将rc资源中的图片加载到MFC的CImage对象中(附源码)

CImage析构函数问题?