VC++关于如何用GDI+取得图片的Hbitmap

VC++关于如何用GDI+取得图片的Hbitmap,第1张

没有简单直接的办法。

比较曲折的办法有两个,一个是通过DC绘制获取:

Image pImage = Image::FromFile(L"c:\\testgif");

Status status = pImage->GetLastStatus();

if(Ok == status)

{

   CDC dc;

   dcCreateCompatibleDC(NULL);

   CBitmap bitmap;

   bitmapCreateCompatibleBitmap(&dc, pImage->GetWidth(), pImage->GetHeight());

   CBitmap pbmpOld = dcSelectObject(&bitmap);

   Graphics graphics(dcm_hDC);

   status = graphicsGetLastStatus();

   if(Ok == status)

   {

      graphicsDrawImage(pImage, 0, 0);

      // enjoy of bitmap;

   }

   dcSelectObject(pbmpOld);

}

一个是用同样是GDI+的Bitmap重新读取文件或读取Image保存的文件:

Bitmap pBitmap = Bitmap::FromFile(L"c:\\testgif");

Status status = pBitmap->GetLastStatus();

if(Ok == status)

{

   HBITMAP hBitmap = NULL;

   status = pBitmap->GetHBITMAP(Color(0,0,0), &hBitmap);

   if(Ok == status)

   {

      // enjoy of bitmap;

   }

}

如果我们的CBitmap是得到设备兼容的位图:即:CreateCompatibleBitmap来创建的位图,则最好使用

GetDIBits得到位图数据; ::GetDIBits(memdcm_hDC, btp, 0, bpbmHeight, pData, pBpInfo, DIB_RGB_COLORS);

之后就可以根据位图数据显示该位图了

// 在客户区显示位图

CClientDC dc(this);

StretchDIBits(dcm_hDC, 0, 0, bpbmWidth, bpbmHeight, 0, 0, bpbmWidth, bpbmHeight, pData, pBpInfo, DIB_RGB_COLORS, SRCCOPY);

也可以利用GetBitmapBits得到位图信息,但是得到的位图数据需要转化才与本来位图实际数据对应。

// 对于与设备兼容的位图,用GetBitmapBits得到的位图数据需要转换才可以正确显示位图

// 用GetBitmapBits,然后交换每行数据,最后再交行整个缓冲数据

// 位图本来存储格式如下:

// [gk]

// [jt]

// []

// [yb]

// [xa]

// 但是利用GetBitmapBits得到位图数据格式为 [xa][yb][][jt][gk]

// 我们需要将其转化为[gk][jt][][yb][xa]

// 步骤为:第一步将每行数据逆置,得到[ax][by][][tj][kg]

// 第二步:将第一步得到的格式,当做一个整体,进行逆置则得到[gk][jt][][yb][xa]

dwRet = btpGetBitmapBits(bpbmWidthBytes bpbmHeight, pData); // 该方式获取位图信息,位图对象应该是LoadBitmap形式获取的

int nRow = bpbmHeight; // 行数

不要直接获取picturecontrol的dc以后就开始画画画

获取以后创建一个兼容的bitmap,然后创建一个兼容dc,把bitmap选到dc里,在新dc里画画画,画了以后用SetBitmap搞进去

注意:后续的绘画如果要SetBitmap给它一个新的Bitmap,记得把之前的Bitmap删掉,否则会内存泄漏。

(用GetBitmap出来然后DeleteObject,或者GetBitmap出来然后修改Bitmap之后对控件调用InvalidateRect

以上就是关于VC++关于如何用GDI+取得图片的Hbitmap全部的内容,包括:VC++关于如何用GDI+取得图片的Hbitmap、GetBitmapBits和GetDIBits的区别、mfc 如何在创建窗口时画图等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9520879.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存