其实是件很简单的事情,结果搞了一个下午,原因就是一个小小的细节,唉,总是败在这上面。。。
首先,从CBitmap中提取像素数据赋值给BYTE类型,代码如下:
CBitmap Bmp;//背景图片 Bmp.LoadBitmap(IDB_BITMAP1);//从资源中载入BMP位图 Bmp.GetBitmap(&bm); //获得位图大小结构 long sizeByte = bm.bmHeight * bm.bmWidth * 4; //计算像素数据大小,因为是32位图,所以*4,如果是24位,则*3 BYTE *pBmpBuffer = new BYTE[sizeByte]; memset(pBmpBuffer, 0, sizeByte);//初始化内存指针 Bmp.GetBitmapBits(sizeByte, pBmpBuffer);//复制像素数据
然后是BYTE转换为CBitmap,代码如下:
CBitmap bkBmp; CDC *pDC = GetDC(); long sizeByte = bkHeight * bkWidth * 4; bkBmp.CreateCompatibleBitmap(pDC,bkWidth,bkHeight);//初始化图形,否则没有文件头 bkBmp.SetBitmapBits(sizeByte,pImg);//复制像素数据
我在初始化图像那里卡了好久。。。因为自己定义的CBitmap变量是一个CBitmap类型指针,然后我就
bkBmp->CreateCompatibleBitmap(pDC,bkWidth,bkHeight);
结果总是报错,也不知道是为什么,改成变量之后就一切正常了,我估计是因为指针无法进行初始化,因为没有对象。
看来其他人的做法,如果还原的图像比较复杂,由BYTE还原CBitmap最保险的方法是
首先定义BITMAPINFO变量,然后对这个变量进行初始化,定义好图片的文件头,接着使用CreateDIBSection,根据BITMAPINFO创建一个空的位图,然后用memcpy把BYTE中的像素数据拷贝到这个空位图中,最后用CBitmap::FromHandle把得到的HBITMAP类型变量转换为CBitmap类型。
因为在这个方法中,头文件是你自己定义的,所以可以自己根据原来的图片来进行定义,程序员自身的权力大。但是,我衷心祈祷以后用不到这么麻烦的方法~