C/C++:何以在程序中加载JPG图片?

 C/C++:何以在程序中加载JPG图片?
2008-11-04
MFC提供的CWnd唯有默许加载BMP资料的接口,对JPG等图像是不支持的,而现实中常常急需用到非BMP的图片,加载它们急需运用COM技术。第一写如次函数:
以次是引述片断:
BOOL LoadMyJpegFile(CString fname,LPPICTURE *lppi)
{
HANDLE hFile=CreateFile(fname,GENERIC_READ,零,NULL,OPEN_EXISTING,零,NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
CString str;
str.Format(_T("%s没法被打开"),fname);
MessageBox(str);
return FALSE;
}
//获得资料大小
DWORD dwFileSize=GetFileSize(hFile,NULL);

if((DWORD)-一==dwFileSize)
{
CloseHandle(hFile);
MessageBox(_T("图像资料是空的"));
return FALSE;
}
//读取图像资料
LPVOID pvData;

//按资料大小分配内存储器
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);

if(NULL==hGlobal)
{
CloseHandle(hFile);
MessageBox(_T("内存不足,没法分配足够内存储器"));
return FALSE;
}

pvData=GlobalLock(hGlobal);
if(NULL==pvData)
{
GlobalUnlock(hGlobal);
CloseHandle(hFile);
MessageBox(_T("没法锁定内存储器"));
return FALSE;
}

DWORD dwFileRead=零;
BOOL bRead=ReadFile(hFile,pvData,dwFileSize,&dwFileRead,NULL);
GlobalUnlock(hGlobal);
CloseHandle(hFile);
if(FALSE==bRead)
{
MessageBox(_T("读资料疏失"));
return FALSE;
}

LPSTREAM pstm=NULL;
//从已分配内存储器生成IStream源
HRESULT hr=CreateStreamOnHGlobal(hGlobal,TRUE,&pstm);

if(!SUCCEEDED(hr))
{
MessageBox(_T("生成流操作失败"));
if(pstm!=NULL)
pstm->Release();
return FALSE;
}
else if(pstm==NULL)
{
MessageBox(_T("生成流操作失败"));
return FALSE;
}


if(!*lppi)
(*lppi)->Release();
hr=OleLoadPicture(pstm,dwFileSize,FALSE,IID_IPicture,(LPVOID*)&(*lppi));
pstm->Release();
if(!SUCCEEDED(hr))
{
MessageBox(_T("加载操作失败"));
return FALSE;
}
else if(*lppi==NULL)
{
MessageBox(_T("加载操作失败"));
return FALSE;
}
return TRUE;
}


其后在头资料中加入变量宣言和函数宣言:


以次是摘引片断:


BOOL LoadMyJpegFile(CString fname,LPPICTURE *lppi);
LPPICTURE m_lppi;//加载图像资料的源
BOOL m_bHadLoad;//已经加载了背景图像
其后在OnPaint函数中加入:

if(m_bHadLoad)
{
CDC *pDC=GetDC();
CRect rc;
long hmWidth=零;
long hmHeight=零;
m_lppi->get_Height(&hmHeight);
m_lppi->get_Width(&hmWidth);
GetClientRect(&rc);
int nWidth,nHeight;
nWidth=rc.Width();
nHeight=rc.Height();
HRESULT hr=m_lppi->Render(pDC->m_hDC,nWidth,零,-nWidth,nHeight,hmWidth,hmHeight,-hmWidth,-hmHeight,&rc);
}
在OnInitDialog函数中这么调用上头的加载函数:
TCHAR strPath[MAX_PATH];
memset(strPath,零,MAX_PATH);
GetCurrentDirectory(MAX_PATH,strPath);
wcscat_s(strPath,MAX_PATH,_T("//a_bear.jpg"));
m_bHadLoad=LoadMyJpegFile(strPath,&m_lppi);



就可以展示jpg图片了,最后要记得在OnDestroy函数中加入:
m_lppi->Release();
来开释对象。
本文来源:
我的异常网
Java Exception
Dotnet Exception
Oracle Exception

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值