7,655
社区成员
发帖
与我相关
我的任务
分享
#include <imaging.h>
#include <initguid.h>
#include <imgguids.h>
void CradjpgDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialog::OnPaint()
CFile file;
CFileException fe;
CString FileName ;
DWORD dwFileLength;
BYTE* pBuff;
FileName=L"\\Storage Card\\GPSHZ\\Map2010\\1-11-7.jpg";
if(0 == file.Open(FileName, CFile::modeRead | CFile::shareDenyWrite, &fe)) //打开文件
{
AfxMessageBox(L"打开文件失败");
return ;
}
dwFileLength = file.GetLength(); //取得文件总长度
pBuff=new BYTE[dwFileLength];
file.Seek(0 ,CFile::begin); //定位
file.Read((BYTE*)(pBuff) , dwFileLength); //读字节
file.Close();
IImagingFactory *pImgFactory = NULL;
IImage *pImage = NULL;
HRESULT hrCoInit;
HDC hdcCont=NULL,hdcMem=NULL;
ImageInfo pimageinfo;//= new sizeof(ImageInfo);
RECT rect;
//pImgFactory->CreateBitmapFromBuffer( );
//if(FAILED(pImagingFactory->CreateImageFromBuffer(byData,dwLen,BufferDisposalFlag::BufferDisposalFlagCoTaskMemFree,&pImage)))goto End;
//ImageInfo imgInfo;
//使用IImagingFactory的CreateImageFromBuffer获取IImage指针时,需要注意参数的设置,
//只有在第三个参数为BufferDisposalFlagNone时才能使用Release,不然会报内存错误。
//如果参数为BufferDisposalFlagGlobalFree,则图片内存需要使用GlobalFree来释放(GlobalFree的使用要注意)。
//if (FAILED(hrCoInit=CoInitializeEx(NULL, COINIT_MULTITHREADED)))goto End;
//if(FAILED(CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**) &pImagingFactory)))goto End;
hrCoInit=CoInitializeEx(NULL, COINIT_MULTITHREADED);
CoCreateInstance(CLSID_ImagingFactory,NULL,1,IID_IImagingFactory,(void**) &pImgFactory);
pImgFactory->CreateImageFromBuffer(pBuff,dwFileLength,BufferDisposalFlag::BufferDisposalFlagCoTaskMemFree,&pImage);
pImage->GetImageInfo( &pimageinfo);
rect.top =0;
rect.left =0;
rect.right =pimageinfo.Width ;
rect.bottom =pimageinfo.Height ;
pImage->Draw(dc,&rect,NULL);
pImgFactory->Release();
pImage->Release();
delete pBuff;
}
/*
* 下载并转换图像为标准位图格式
* 成功返回宽(低字节),高(高字节),失败返回0
*/
LONG ConvertImage(LPCTSTR lpstrImgUrl,HBITMAP *hBitmap)
{
CHttpRequest httpRequ;
if(!InitHttpRequest(&httpRequ))return FALSE;
//下载图片
if(!httpRequ.OpenConnect(lpstrImgUrl,CHttpRequest::RequestType::GET))return FALSE;
if(!httpRequ.SendRequest())return FALSE;
DWORD dwLen=0;
BYTE *byData=NULL;
if(!httpRequ.ReadData(NULL,&dwLen))return FALSE;
byData=new BYTE[dwLen];
if(!httpRequ.ReadData(byData,&dwLen)) goto End;
///解码图像
LONG lRetn=0;
IImage *pImage=NULL;
IImagingFactory *pImagingFactory=NULL;
HRESULT hrCoInit;
HDC hdcCont=NULL,hdcMem=NULL;
if (FAILED(hrCoInit=CoInitializeEx(NULL, COINIT_MULTITHREADED)))goto End;
if(FAILED(CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**) &pImagingFactory)))goto End;
if(FAILED(pImagingFactory->CreateImageFromBuffer(byData,dwLen,BufferDisposalFlag::BufferDisposalFlagCoTaskMemFree,&pImage)))goto End;
ImageInfo imgInfo;
if(FAILED(pImage->GetImageInfo(&imgInfo)))goto End;
//将解码后的图像画入内存DC中
hdcCont=GetDC(NULL);
*hBitmap=CreateCompatibleBitmap(hdcCont,imgInfo.Width,imgInfo.Height);
hdcMem=CreateCompatibleDC(hdcCont);
SelectObject(hdcMem,*hBitmap);
RECT rect={0,0,imgInfo.Width,imgInfo.Height};
pImage->Draw(hdcMem,&rect,NULL);
//返回位置的宽,高
lRetn=MAKELONG(imgInfo.Width,imgInfo.Height);
End:
if(hdcMem)DeleteDC(hdcMem);
if(hdcCont)DeleteDC(hdcCont);
if(pImage)pImage->Release();
if(pImagingFactory)pImagingFactory->Release();
if(byData)delete[] byData;
if(SUCCEEDED(hrCoInit))CoUninitialize();
return lRetn;
}