VC MFC 提供的 API LoadBitmap / LoadImage 类 CBitmap 等都只能操作 BMP 位图,图标。对于其他常用的 JPG / JPEG / GIF / PNG 格式,它无能为力。VC 下怎样才能加载各种非 BMP 格式的图片呢? 下面介绍一种最简单的办法。用 CImage 类的 Load 函数加载图片,之后用 Detach 取得 HBITMAP 句柄。取得图片的HBITMAP 句柄后就可以像操作 BMP 图片一样处理 JPG / JPEG / GIF / PNG 格式的图片了。具体代码如下:
#include “atlimage.h”
CImage img;
HRESULT ret = img.Load(filename ); // filename 是要加载的文件名(包含路径)
HBITMAP bitmap = img.Detach();
//像操作 BMP 图片一样处理图片
////////////////////////////////////////////////////////////////////////////////////////
在OnDraw()函数中添加如下的代码,并在工程目录下放入test.jpg的图片。
IPicture *pPic;
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
if(file.Open(“test.jpg”,CFile::modeRead)&&file.GetStatus(“test.jpg”,fstatus)&& ((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
CRect rect;
GetClientRect(rect);
fX=rect.Width();
fY=rect.Height();
//fX =(double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
//fY =(double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))AfxMessageBox(“Failed To Render The picture!”);
pPic->Release();
}
else
AfxMessageBox(“Error Loading Picture From Stream!”);
}
}
}
else
AfxMessageBox(“Can't Open Image File!”);
本文来源:https://www.wddqw.com/doc/a2b0b48b84868762caaed5c8.html
正在阅读:
VC下加载 JPG JPEG GIF PNG 图片最简单的方法01-01
日本留学出入境攻略介绍01-01
九九重阳节的传说故事01-01
描写绿色的诗句01-01
历史新闻01-01
乔纳森建构主义学习环境设计研究01-01
开心四字成语01-01
怎样把握小学生作文“抄”与“写”的度01-01