(急)VC中gdi+ 里的bitmap类的lockbits函数

找了很多这个函数的使用方法,但几乎都是在C#里的,好像在gdi+里函数参数不一样。我也是想获得图像的像素信息,具体代码如下:***********************... 找了很多这个函数的使用方法,但几乎都是在C#里的,好像在gdi+里函数参数不一样。
我也是想获得图像的像素信息,具体代码如下:
*****************************************************************
int Height=m_pImage->GetHeight();
int Width=m_pImage->GetWidth();

Rect rect1(0,0,Width,Height);
const Rect* rect=&rect1;

UINT Flags=ImageLockModeUserInputBuf;
PixelFormat Format=m_pImage->GetPixelFormat();

long dwsize=sizeof(BitmapData);
BitmapData *lockedBitmapData;
lockedBitmapData=new BitmapData[dwsize];

m_pImage->LockBits(rect,Flags,Format, lockedBitmapData);
*****************************************************************
lockedBitmapData里的属性 PixelFormat ,Width, Height 都有改变,也是正确的,但是Scan0 ,Stride 却没有变化,并且很明显是错误的。
这是为什么啊?

补充:VC gdi+里LockBits函数声明如下,与C#中不一样,且只有这一种形式
Bitmap::LockBits(
IN const Rect* rect,
IN UINT flags,
IN PixelFormat format,
OUT BitmapData* lockedBitmapData
)
展开
 我来答
silvergingko
2010-03-26 · TA获得超过5945个赞
知道小有建树答主
回答量:688
采纳率:0%
帮助的人:870万
展开全部
对于陌生的函数,一般是需要查看MSDN的,就好比生字需要查字典是一样的。
不知道楼主在写代码的时候有没有查看过MSDN呢?

MSDN对该函数的各个参数的用法和作用说明都是比较容易理解的。楼主可以去查看一下就知道楼主给的代码是不正确的。

简单说下,如果提供了ImageLockModeUserInputBuf,就需要自己提供lockedBitmapData,并且在将该参数传给函数前需要对该结构体进行初始化,其中的一个成员Scan0 是个指针变量,该变量会被函数使用,用途就是将像素信息存储到该指针所指向的缓冲区。楼主只是分配了结构体,但未分配存储像素信息的缓冲区。所以会出错。应该先分配一个缓冲区,然后将缓冲区的地址填写到lockedBitmapData的Scan0中。这个就是主要问题了,更多信息楼主见MSDN。

P.S.
LockBits函数声明的最后一个参数是IN OUT,不是单纯的OUT。
伪形式应该是:[optional in] out

------------------------------------------------------
Scan0是另外分配的存储空间,要么是函数分配的,要么是函数调用者分配的。
如果修改了Scan0,就需要调用UnLockBits后,才会把像素实际更改到Image中。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式