载入其它格式的图片,转为HBITMAP(COM实现)

//Post By lixiaosan(小三) on http://community.csdn.net/Expert/topic/4193/4193617.xml?temp=.4021723

HBITMAP ImageLoad(LPCTSTR szFile, HBITMAP hRet)
{
 LPPICTURE gpPicture;
 // open file
 HANDLE hFile = ::CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
 ASSERT(INVALID_HANDLE_VALUE != hFile);
 
 // get file size
 DWORD dwFileSize = ::GetFileSize(hFile, NULL);
 ASSERT(-1 != dwFileSize);
 
 LPVOID pvData = NULL;
 // alloc memory based on file size
 HGLOBAL hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
 ASSERT(NULL != hGlobal);
 
 pvData = ::GlobalLock(hGlobal);
 ASSERT(NULL != pvData);
 
 DWORD dwBytesRead = 0;
 // read file and store in global memory
 BOOL bRead = ::ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
 ASSERT(FALSE != bRead);
 ::GlobalUnlock(hGlobal);
 ::CloseHandle(hFile);
 
 LPSTREAM pstm = NULL;
 // create IStream* from global memory
 HRESULT hr = ::CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
 ASSERT(SUCCEEDED(hr) && pstm);
 
 // Create IPicture from image file
 hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
 ASSERT(SUCCEEDED(hr) && gpPicture); 
 pstm->Release();
 
 OLE_HANDLE picHandle;
 gpPicture->get_Handle(&picHandle);
 HDC hdc = ::CreateCompatibleDC(NULL);
 ASSERT(hdc);
 ::SelectObject(hdc, (HGDIOBJ) picHandle);
 
 hRet = (HBITMAP)::GetCurrentObject(hdc, OBJ_BITMAP);
 DeleteDC(hdc);

 // Get width and height
// BITMAP bmpTemp;
// memset(&bmpTemp, 0, sizeof BITMAP);
// ::GetObject(hRet, sizeof BITMAP, &bmpTemp);
// iWidth = bmpTemp.bmWidth;
// iHeight = bmpTemp.bmHeight;
 
 return hRet;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值