看流星社区

 找回密码
 注册账号
查看: 2623|回复: 0

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

[复制链接]

该用户从未签到

发表于 2018-3-2 13:43:45 | 显示全部楼层 |阅读模式

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

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

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

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

  23.                 pxd[desRGB_B] = pDib[srcRGB_B];
  24.                 pxd[desRGB_B+1] = pDib[srcRGB_B+1];
  25.                 pxd[desRGB_B+2] = pDib[srcRGB_B+2];
  26.             }
  27.         }
  28.     }
  29.     else
  30.     {
  31.         //通过调色板获取像素数据
  32.         for (int i = 0; i < bm.bmHeight; i++)
  33.         {
  34.             for (int j = 0; j < bm.bmWidth; j++)
  35.             {
  36.                 RGBQUAD srcRGB_B=cximage->GetPixelColor(j,bm.bmHeight-1-i);
  37.                 int desRGB_B=i*bm.bmWidthBytes+j*pb;

  38.                 pxd[desRGB_B] = srcRGB_B.rgbBlue;
  39.                 pxd[desRGB_B+1] = srcRGB_B.rgbGreen;
  40.                 pxd[desRGB_B+2] = srcRGB_B.rgbRed;
  41.             }
  42.         }
  43.     }

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

  46.     return BMP;
  47. }
复制代码

点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-19 07:15

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表