首页
社区
课程
招聘
[讨论]大家有遇到过直接把网络上的图片显示到本地对话框或PICTURE控件上吗?(不用先把图片下到本地,然后再显示)
发表于: 2012-11-20 13:26 4851

[讨论]大家有遇到过直接把网络上的图片显示到本地对话框或PICTURE控件上吗?(不用先把图片下到本地,然后再显示)

2012-11-20 13:26
4851
今天在网络上搜到一份。
核心代码:
IPicture *pGlobalPic=NULL;        
//最后的时候,判断一下,如果不是NULL,就释放一次。
// 显示图片, lpstrImgUrl 为图片URL地址,hWnd 为窗口句柄       
HRESULT ShowPic(char *lpstrImgUrl,HWND hWnd)        
{        
    HDC hDC_Temp=GetDC(hWnd);        
        
    IPicture *pPic;        
    IStream *pStm;        
        
    BOOL bResult;        
        
    DWORD dwFileSize,dwByteRead;        
        
    //读取网页上图片文件,实际是个CHttpFile指针    
    CInternetSession session("HttpClient");    
    CFile* httpFile = (CFile*)session.OpenURL(lpstrImgUrl);    
        
    if (httpFile!=INVALID_HANDLE_VALUE)        
    {        
        dwFileSize=  httpFile->GetLength();//获取文件字节数        
            
        if (dwFileSize==0xFFFFFFFF)        
            return E_FAIL;        
    }        
    else        
    {        
        return E_FAIL;        
    }        
        
        
    //分配全局存储空间        
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);        
    LPVOID pvData = NULL;        
        
    if (hGlobal == NULL)        
        return E_FAIL;        
        
    if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块        
        return E_FAIL;        
        
    //把文件读入内存缓冲区        
    dwByteRead = httpFile->Read(pvData,dwFileSize);    
        
    GlobalUnlock(hGlobal);        
        
    CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);        
        
    //装入图形文件        
    bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);        
        
    if(FAILED(bResult))        
        return E_FAIL;        
        
    OLE_XSIZE_HIMETRIC hmWidth; //图片的真实宽度, 单位为英寸       
    OLE_YSIZE_HIMETRIC hmHeight; //图片的真实高度, 单位为英寸       
    pPic->get_Width(&hmWidth);        
    pPic->get_Height(&hmHeight);        
        
    //转换hmWidth和hmHeight为pixels距离,1英寸=25.4毫米       
    int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);       
    int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);       
        
    //将图形输出到屏幕上(有点像BitBlt)        
    bResult=pPic->Render(hDC_Temp,10,40,nWidth,nHeight,        
        0,hmHeight,hmWidth,-hmHeight,NULL);        
        
    pPic->Release();        
        
    httpFile->Close();//关闭打开的文件        
        
    if (SUCCEEDED(bResult))        
    {        
        return S_OK;        
    }        
    else        
    {        
        return E_FAIL;        
    }        
}  


附件中包含了一个完整工程,方便交流。
另外附件中也包含了一个发现的BUG,欢迎大家交流学习。
BUG就是有些URL可以有些却有问题,比如:
http://img1.2345.com/duoteimg/softImg/soft/7/1331706305_41.jpg这个URL实际上是有图片的,用这个却得不到,调试可以看出应该是OleLoadPicture这里出了问题,恳请各位大虾看看究竟毛病出在了哪里?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 1136
活跃值: (683)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
如果网络图片是PNG的是否可以正确显示?
2012-11-20 17:03
0
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
可以的,因为用的是COM--IPicture
2012-11-20 17:55
0
雪    币: 1136
活跃值: (683)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我测试是无法显示,我也用COM来实现过但是就是不能显示PNG的图片,后来用了cximage才显示出来了
2012-11-20 20:31
0
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
主要就是想知道那个函数为什么错了,错在哪里了,如果是下载到本地再显示的话那就很简单了,直接API就行了。
	HRESULT ret=URLDownloadToFile(NULL,"http://img1.2345.com/duoteimg/softImg/soft/7/1331706305_41.jpg","123.jpg",0,NULL);
2012-11-21 08:01
0
游客
登录 | 注册 方可回帖
返回
//