VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 261|回复: 2

[已解决]显示网页图片失败

[复制链接]
33_avatar_middle
最佳答案
0 
donate_vip 发表于 2021-9-20 23:23:53 | 显示全部楼层 |阅读模式

HRESULT ShowPic1(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, 0, 0, nWidth, nHeight,
                0, hmHeight, hmWidth, -hmHeight, NULL);

        pPic->Release();

        httpFile->Close();//关闭打开的文件

        if (SUCCEEDED(bResult))
        {
                return S_OK;
        }
        else
        {
                return E_FAIL;
        }
}
// 显示图片, 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, 0, 0, nWidth, nHeight,
                0, hmHeight, hmWidth, -hmHeight, NULL);
        pPic->Release();
        httpFile->Close();//关闭打开的文件
        if (SUCCEEDED(bResult))
        {
                return S_OK;
        }
        else
        {
                return E_FAIL;
        }
}


两个函数都显示不出来
最佳答案
31_avatar_small
2021-9-21 12:11:56
你的代码中的问题自个慢慢找,给你贴代码,从我的项目中扣出来改了下,拖个 Picture control 放到主窗口,复制代码粘贴到按钮事件中就能看到效果,你要放到自己项目中的话,自己优化一下,把变量改成成员变量,然后在析构器中释放资源。
  1. // 图片地址
  2.         CString szURL = _T("https://img-blog.csdnimg.cn/20210113161311453.jpg");

  3.         // IDC_IMG 自己拖个 Picture control 放到主窗口
  4.         CDC *pDc = GetDlgItem(IDC_IMG)->GetDC();
  5.         SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);

  6.         CInternetSession session;
  7.         CStdioFile* pFile = session.OpenURL(szURL, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
  8.         if (NULL == pFile)
  9.         {
  10.                 ReleaseDC(pDc);
  11.                 AfxMessageBox(_T("OpenURL 失败"));
  12.                 return;
  13.         }

  14.         // 获得文件大小
  15.         SIZE_T nLen = (SIZE_T)pFile->SeekToEnd();
  16.         pFile->SeekToBegin();
  17.         if (nLen <= 0)
  18.         {
  19.                 pFile->Close();
  20.                 delete pFile;
  21.                 ReleaseDC(pDc);
  22.                 AfxMessageBox(_T("获取文件大小失败"));
  23.                 return;
  24.         }

  25.         // 在堆上分配空间
  26.         HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nLen);
  27.         if (NULL == hGlobal)
  28.         {
  29.                 pFile->Close();
  30.                 delete pFile;
  31.                 ReleaseDC(pDc);
  32.                 AfxMessageBox(_T("分配内存失败, 错误代码: ") + GetLastError());
  33.                 return;
  34.         }

  35.         // 锁定堆空间,获取指向堆空间的指针
  36.         LPVOID lpData = GlobalLock(hGlobal);
  37.         if (NULL == lpData)
  38.         {
  39.                 pFile->Close();
  40.                 delete pFile;
  41.                 GlobalFree(hGlobal);
  42.                 ReleaseDC(pDc);
  43.                 AfxMessageBox(_T("锁定堆空间失败, 错误代码: ") + GetLastError());
  44.                 return;
  45.         }

  46.         pFile->Read(lpData, nLen);
  47.         pFile->Close();
  48.         delete pFile;

  49.         // 在堆中创建流对象
  50.         IStream* pStream = nullptr;
  51.         HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pStream);
  52.         GlobalUnlock(hGlobal);
  53.         if (FAILED(hr))
  54.         {
  55.                 GlobalFree(hGlobal);
  56.                 ReleaseDC(pDc);
  57.                 AfxMessageBox(_T("创建流对象失败"));
  58.                 return;
  59.         }
  60.         // 利用流加载图像
  61.         IPicture *pPicture = nullptr;
  62.         hr = OleLoadPicture(pStream, nLen, TRUE, IID_IPicture, (LPVOID*)&pPicture);
  63.         pStream->Release();
  64.         if (FAILED(hr))
  65.         {
  66.                 GlobalFree(hGlobal);
  67.                 ReleaseDC(pDc);
  68.                 AfxMessageBox(_T("加载图像失败"));
  69.                 return;
  70.         }
  71.        
  72.         OLE_XSIZE_HIMETRIC nWidth;
  73.         OLE_YSIZE_HIMETRIC nHeight;
  74.         pPicture->get_Width(&nWidth);
  75.         pPicture->get_Height(&nHeight);

  76.         if (pPicture != NULL)
  77.         {
  78.                 CRect rect;
  79.                 GetDlgItem(IDC_IMG)->GetClientRect(rect);
  80.                 pPicture->Render(pDc->m_hDC, 0, 0, rect.Width(), rect.Height(), 0, nHeight, nWidth, -nHeight, &rect);
  81.                 pPicture->Release();
  82.         }
  83.         GlobalFree(hGlobal);
  84.         ReleaseDC(pDc);
复制代码




上一篇:组合按键
下一篇:OpenSCManager的提权问题
31_avatar_middle
最佳答案
49 
在线会员 发表于 2021-9-21 12:11:56 | 显示全部楼层    本楼为最佳答案   
bestAnswer
你的代码中的问题自个慢慢找,给你贴代码,从我的项目中扣出来改了下,拖个 Picture control 放到主窗口,复制代码粘贴到按钮事件中就能看到效果,你要放到自己项目中的话,自己优化一下,把变量改成成员变量,然后在析构器中释放资源。
  1. // 图片地址
  2.         CString szURL = _T("https://img-blog.csdnimg.cn/20210113161311453.jpg");

  3.         // IDC_IMG 自己拖个 Picture control 放到主窗口
  4.         CDC *pDc = GetDlgItem(IDC_IMG)->GetDC();
  5.         SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);

  6.         CInternetSession session;
  7.         CStdioFile* pFile = session.OpenURL(szURL, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
  8.         if (NULL == pFile)
  9.         {
  10.                 ReleaseDC(pDc);
  11.                 AfxMessageBox(_T("OpenURL 失败"));
  12.                 return;
  13.         }

  14.         // 获得文件大小
  15.         SIZE_T nLen = (SIZE_T)pFile->SeekToEnd();
  16.         pFile->SeekToBegin();
  17.         if (nLen <= 0)
  18.         {
  19.                 pFile->Close();
  20.                 delete pFile;
  21.                 ReleaseDC(pDc);
  22.                 AfxMessageBox(_T("获取文件大小失败"));
  23.                 return;
  24.         }

  25.         // 在堆上分配空间
  26.         HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nLen);
  27.         if (NULL == hGlobal)
  28.         {
  29.                 pFile->Close();
  30.                 delete pFile;
  31.                 ReleaseDC(pDc);
  32.                 AfxMessageBox(_T("分配内存失败, 错误代码: ") + GetLastError());
  33.                 return;
  34.         }

  35.         // 锁定堆空间,获取指向堆空间的指针
  36.         LPVOID lpData = GlobalLock(hGlobal);
  37.         if (NULL == lpData)
  38.         {
  39.                 pFile->Close();
  40.                 delete pFile;
  41.                 GlobalFree(hGlobal);
  42.                 ReleaseDC(pDc);
  43.                 AfxMessageBox(_T("锁定堆空间失败, 错误代码: ") + GetLastError());
  44.                 return;
  45.         }

  46.         pFile->Read(lpData, nLen);
  47.         pFile->Close();
  48.         delete pFile;

  49.         // 在堆中创建流对象
  50.         IStream* pStream = nullptr;
  51.         HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pStream);
  52.         GlobalUnlock(hGlobal);
  53.         if (FAILED(hr))
  54.         {
  55.                 GlobalFree(hGlobal);
  56.                 ReleaseDC(pDc);
  57.                 AfxMessageBox(_T("创建流对象失败"));
  58.                 return;
  59.         }
  60.         // 利用流加载图像
  61.         IPicture *pPicture = nullptr;
  62.         hr = OleLoadPicture(pStream, nLen, TRUE, IID_IPicture, (LPVOID*)&pPicture);
  63.         pStream->Release();
  64.         if (FAILED(hr))
  65.         {
  66.                 GlobalFree(hGlobal);
  67.                 ReleaseDC(pDc);
  68.                 AfxMessageBox(_T("加载图像失败"));
  69.                 return;
  70.         }
  71.        
  72.         OLE_XSIZE_HIMETRIC nWidth;
  73.         OLE_YSIZE_HIMETRIC nHeight;
  74.         pPicture->get_Width(&nWidth);
  75.         pPicture->get_Height(&nHeight);

  76.         if (pPicture != NULL)
  77.         {
  78.                 CRect rect;
  79.                 GetDlgItem(IDC_IMG)->GetClientRect(rect);
  80.                 pPicture->Render(pDc->m_hDC, 0, 0, rect.Width(), rect.Height(), 0, nHeight, nWidth, -nHeight, &rect);
  81.                 pPicture->Release();
  82.         }
  83.         GlobalFree(hGlobal);
  84.         ReleaseDC(pDc);
复制代码
33_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-9-22 22:20:30 | 显示全部楼层
cpp2019 发表于 2021-9-21 12:11
你的代码中的问题自个慢慢找,给你贴代码,从我的项目中扣出来改了下,拖个 Picture control 放到主窗口, ...

您真聪明~来 啵一个显示网页图片失败
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-10-23 17:14

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表