没有简单直接的办法。
比较曲折的办法有两个,一个是通过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 如何在创建窗口时画图等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)