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
废话不多说,先上关键代码
示例代码下载:
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()方法中
其余的代码可以无视之
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()方法中
其余的代码可以无视之
相关文章推荐
- Google提供的Thumbnails对图片的各种操作(缩放、加水印、翻转、转换图片格式)性能比jdk提供的好N倍,压缩出来的图片更清晰
- 把各种格式图片转换成PDF的方法
- CxImage与OpenGL结合,用于读入多种格式的纹理以及用来把屏幕保存为各种格式的图像文件
- PHP将HTML转换成各种格式图片或PDF
- 内存转换图片格式
- CxImage与OpenGL结合,用于读入多种格式的纹理以及用来把屏幕保存为各种格式的图像文件。 关于CxImage的文章,网上有许多,这里只介绍如何把CxImage与OpenGL结合起来,用于读
- CxImage与OpenGL结合,用于读入多种格式的纹理以及用来把屏幕保存为各种格式的图像文件
- 不同格式图片相互转换的开源库分享(使用CxImage,并有VC6的配置过程)
- CxImage与OpenGL结合,用于读入多种格式的纹理以及用来把屏幕保存为各种格式的图像文件
- 内存中读取bmp图片转换为IplImage格式
- CxImage与OpenGL结合,用于读入多种格式的纹理以及用来把屏幕保存为各种格式的图像文件。
- CxImage与OpenGL结合,用于读入多种格式的纹理以及用来把屏幕保存为各种格式的图像文件。
- CxImage与OpenGL结合,用于读入多种格式的纹理以及用来把屏幕保存为各种格式的图像文件。
- 使用GDI+在内存中转换图片类型
- BCB实现BMP图片的RGB分解,BMP与JPG格式的相互转换
- VC中使用GDI+在内存转换图片类型
- 判断内存流中的图片格式
- [分享]各种图片格式详解及应用[图像图形(图象)论坛]
- 判断内存流中的图片格式
- 使用GDI+在内存中转换图片类型