(急)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
) 展开
我也是想获得图像的像素信息,具体代码如下:
*****************************************************************
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
) 展开
1个回答
展开全部
对于陌生的函数,一般是需要查看MSDN的,就好比生字需要查字典是一样的。
不知道楼主在写代码的时候有没有查看过MSDN呢?
MSDN对该函数的各个参数的用法和作用说明都是比较容易理解的。楼主可以去查看一下就知道楼主给的代码是不正确的。
简单说下,如果提供了ImageLockModeUserInputBuf,就需要自己提供lockedBitmapData,并且在将该参数传给函数前需要对该结构体进行初始化,其中的一个成员Scan0 是个指针变量,该变量会被函数使用,用途就是将像素信息存储到该指针所指向的缓冲区。楼主只是分配了结构体,但未分配存储像素信息的缓冲区。所以会出错。应该先分配一个缓冲区,然后将缓冲区的地址填写到lockedBitmapData的Scan0中。这个就是主要问题了,更多信息楼主见MSDN。
P.S.
LockBits函数声明的最后一个参数是IN OUT,不是单纯的OUT。
伪形式应该是:[optional in] out
------------------------------------------------------
Scan0是另外分配的存储空间,要么是函数分配的,要么是函数调用者分配的。
如果修改了Scan0,就需要调用UnLockBits后,才会把像素实际更改到Image中。
不知道楼主在写代码的时候有没有查看过MSDN呢?
MSDN对该函数的各个参数的用法和作用说明都是比较容易理解的。楼主可以去查看一下就知道楼主给的代码是不正确的。
简单说下,如果提供了ImageLockModeUserInputBuf,就需要自己提供lockedBitmapData,并且在将该参数传给函数前需要对该结构体进行初始化,其中的一个成员Scan0 是个指针变量,该变量会被函数使用,用途就是将像素信息存储到该指针所指向的缓冲区。楼主只是分配了结构体,但未分配存储像素信息的缓冲区。所以会出错。应该先分配一个缓冲区,然后将缓冲区的地址填写到lockedBitmapData的Scan0中。这个就是主要问题了,更多信息楼主见MSDN。
P.S.
LockBits函数声明的最后一个参数是IN OUT,不是单纯的OUT。
伪形式应该是:[optional in] out
------------------------------------------------------
Scan0是另外分配的存储空间,要么是函数分配的,要么是函数调用者分配的。
如果修改了Scan0,就需要调用UnLockBits后,才会把像素实际更改到Image中。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询