您的位置:首页 > 其它

VS2010 用CxImage读入各种图片格式后在内存中转换为HBITMAP位图

2015-01-13 13:54 471 查看
最近自学游戏引擎设计,希望将各种图片格式读入内存后转为HBITMAP处理,四处搜寻无果,最终参考以下两篇博文自己搞定之
http://blog.csdn.net/wu_xiangwei/article/details/5096529 http://www.cnblogs.com/xiangism/archive/2012/10/16/2725692.html
废话不多说,先上关键代码

//将CxImage转为位图
HBITMAP Draw::ChangeCxImageToBMP(HDC hDC,CxImage* cximage)
{
//创建HBITMAP
HBITMAP BMP=CreateCompatibleBitmap(hDC,cximage->GetWidth(),cximage->GetHeight());
BITMAP bm;
GetObject(BMP,sizeof(BITMAP),&bm);
int pb=bm.bmBitsPixel/8;	//获取位图位数
int BytesPerLineOut = (bm.bmWidth*pb + 3) / 4 * 4;	//计算每行像素的数据长度
BYTE *pxd = new unsigned char[bm.bmHeight*BytesPerLineOut]; //声明暂存数组

if(cximage->GetBpp()>=16)
{
//直接获取像素数据
int pbx=cximage->GetBpp()/8;	//获取CxImage图片的位数
int BytesPerLine = (bm.bmWidth*pbx + 3) / 4 * 4;	//计算CxImage每行像素的数据长度
BYTE *pDib = cximage->GetBits();	//获取CxImage图片的像素数据

for (int i = 0; i < bm.bmHeight; i++)
{
for (int j = 0; j < bm.bmWidth; j++)
{
int srcRGB_B=(bm.bmHeight-1-i)*BytesPerLine+j*pbx;
int desRGB_B=i*bm.bmWidthBytes+j*pb;

pxd[desRGB_B] = pDib[srcRGB_B];
pxd[desRGB_B+1] = pDib[srcRGB_B+1];
pxd[desRGB_B+2] = pDib[srcRGB_B+2];
}
}
}
else
{
//通过调色板获取像素数据
for (int i = 0; i < bm.bmHeight; i++)
{
for (int j = 0; j < bm.bmWidth; j++)
{
RGBQUAD srcRGB_B=cximage->GetPixelColor(j,bm.bmHeight-1-i);
int desRGB_B=i*bm.bmWidthBytes+j*pb;

pxd[desRGB_B] = srcRGB_B.rgbBlue;
pxd[desRGB_B+1] = srcRGB_B.rgbGreen;
pxd[desRGB_B+2] = srcRGB_B.rgbRed;
}
}
}

SetBitmapBits(BMP,bm.bmHeight*bm.bmWidthBytes,pxd);
delete[] pxd;

return BMP;
}


示例代码下载:
http://download.csdn.net/detail/daeba/8388505
示例代码只测试了JPG、PNG、8位位图、GIF动态图片四种,其余CxImage支持的图片格式尚未测试

代码中包含CxImage(6.00full)的Debug与Release版静态库,默认工程中使用的是Debug版,想运行Release版的话,请替换掉项目中的cximage.lib文件

关键代码在Draw.cpp文件中

初始化代码在GameStart.cpp文件的GameStart()方法中

测试绘图代码在GameStart.cpp文件的GamePaint()方法中

其余的代码可以无视之
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐