博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VS2010 用CxImage读入各种图片格式后在内存中转换为HBITMAP位图
阅读量:6800 次
发布时间:2019-06-26

本文共 1925 字,大约阅读时间需要 6 分钟。

//将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()方法中

其余的代码可以无视之

转载地址:http://psuwl.baihongyu.com/

你可能感兴趣的文章
libevent2的hello world程序 —— 字符大写服务器
查看>>
LINQ简记(2):重要概念
查看>>
jQuery 1.6 源码学习(二)——core.js[2]之extend&ready方法
查看>>
[WPF疑难] 继承自定义窗口
查看>>
WebRTC网关服务器单端口方案实现
查看>>
018 easygui的使用
查看>>
iphone 开发h5 踩过的坑
查看>>
微信支付demo集
查看>>
python读取json的工具jsonreader | the5fire的技术博客
查看>>
Sharepoint学习笔记—习题系列--70-576习题解析 -(Q99-Q101)
查看>>
转oracle 学习 - 表空间
查看>>
百度地图显示多个标注点
查看>>
robots.txt的介绍和写作
查看>>
11个实用jQuery日历插件
查看>>
MySQL slave状态之Seconds_Behind_Master
查看>>
国内外开源与 SaaS ,团队协作平台、项目管理工具整理
查看>>
oracle字符集查看修改
查看>>
[Leetcode] Container With Most Water
查看>>
查看版本信息的命令
查看>>
Linux搭建SVN服务器
查看>>