BYTE和CBitmap之间的转换

 

        其实是件很简单的事情,结果搞了一个下午,原因就是一个小小的细节,唉,总是败在这上面。。。

        首先,从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类型。

       因为在这个方法中,头文件是你自己定义的,所以可以自己根据原来的图片来进行定义,程序员自身的权力大。但是,我衷心祈祷以后用不到这么麻烦的方法~

你可能感兴趣的:(byte,图形)