麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

MFC顯示網(wǎng)絡(luò)圖片_IPicture

2019-11-14 11:48:38
字體:
供稿:網(wǎng)友

轉(zhuǎn)自:https://www.douban.com/note/181738144/

3. ipicture

IPicture的縮放效果好一點(diǎn),有兩種方法:1)一種是直接顯示不下載圖片到本地,[cpp] view plain copy 在CODE上查看代碼片HRESULT CListListBox::ShowPic(CDC* pDC,CString strImgUrl,CRect rect)  {      HDC hDC_Temp = pDC->GetSafeHdc();      IPicture *pPic;      IStream *pStm;      HRESULT bResult;// = FALSE;      DWord dwFileSize,dwByteRead;        //讀取網(wǎng)頁上圖片文件,實(shí)際是個(gè)CHttpFile指針      CInternetsession session(L"HttpClient");      CFile* httpFile = (CFile*)session.OpenURL(strImgUrl);      if (httpFile!=INVALID_HANDLE_VALUE)      {          dwFileSize= httpFile->GetLength();//獲取文件字節(jié)數(shù)          if (dwFileSize==0xFFFFFFFF)              return E_FAIL;      }      else      {          return E_FAIL;      }        //分配全局存儲(chǔ)空間      HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);      LPVOID pvData = NULL;      if (hGlobal == NULL)          return E_FAIL;      if ((pvData = GlobalLock(hGlobal)) == NULL)//鎖定分配內(nèi)存塊          return E_FAIL;        //把文件讀入內(nèi)存緩沖區(qū)      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; //圖片的真實(shí)寬度, 單位為英寸      OLE_YSIZE_HIMETRIC hmHeight; //圖片的真實(shí)高度, 單位為英寸      pPic->get_Width(&hmWidth);      pPic->get_Height(&hmHeight);                  //轉(zhuǎn)換hmWidth和hmHeight為pixels距離,1英寸=25.4毫米      int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);      int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);                //縮放圖片      int nWZoom = nWidth / rect.Width();      int nHZoom = nHeight / rect.Height();      int nZoom = 1;      nZoom = ( nWZoom > nHZoom ) ? nWZoom : nHZoom;      nWidth /= nZoom;      nHeight /= nZoom;      int midW = (rect.left + rect.right) / 2;      int midH = (rect.top + rect.bottom) / 2;      rect.left = midW - nWidth / 2;      rect.right = midW + nWidth / 2;      rect.top = midH - nHeight / 2;      rect.bottom = midH + nHeight / 2;                //將圖形輸出到屏幕上(有點(diǎn)像BitBlt)      bResult=pPic->Render(hDC_Temp,rect.left,rect.top,rect.Width(),rect.Height(),          0,hmHeight,hmWidth,-hmHeight,NULL);        pPic->Release();      httpFile->Close();//關(guān)閉打開的文件        if (SUCCEEDED(bResult))      {          return S_OK;      }      else      {          return E_FAIL;      }    }  2)%20一種是把圖片下載后保存本地再打開。[cpp] view%20plain copy HRESULT CListListBox::ShowPic(CDC* pDC,CString strImgUrl,CRect rect)  {      HDC hDC_Temp = pDC->GetSafeHdc();      HRESULT bResult;// = FALSE;      DWORD dwFileSize = 0,dwByteRead;      CString url = strImgUrl;      CString path = GetPic(strImgUrl);      //if(url.Find(L".jpeg") != -1) return E_FAIL;      if(path.IsEmpty())      {          url = SavePic(url);                  //return FALSE;      }      else      {          url = path;      }      CFile file;      if (!file.Open(url, CFile::modeRead|CFile::shareDenyWrite))      {          return FALSE;      }        CArchive ar(&file, CArchive::load | CArchive::bNoFlushOnDelete);      CArchiveStream arcstream(&ar);      IPicture *pPic;      IStream *pStm = (IStream*)&arcstream ;            //HRESULT hr = OleLoadPicture(pStm, 0, FALSE,IID_IPicture, (LPVOID*)&pPic);          //ASSERT(SUCCEEDED(hr) && m_spIPicture);        //bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);      bResult=OleLoadPicture(pStm,0,FALSE,IID_IPicture,(LPVOID*)&pPic);      if(FAILED(bResult))          return E_FAIL;      OLE_XSIZE_HIMETRIC hmWidth; //圖片的真實(shí)寬度, 單位為英寸      OLE_YSIZE_HIMETRIC hmHeight; //圖片的真實(shí)高度, 單位為英寸      pPic->get_Width(&hmWidth);      pPic->get_Height(&hmHeight);        //轉(zhuǎn)換hmWidth和hmHeight為pixels距離,1英寸=25.4毫米      int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);      int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);        //縮放圖片      double nWZoom = nWidth / rect.Width();      double nHZoom = nHeight / rect.Height();      double nZoom = 1;      nZoom = ( nWZoom > nHZoom ) ? nWZoom : nHZoom;      nWidth /= nZoom;      nHeight /= nZoom;      int midW = (rect.left + rect.right) / 2;      int midH = (rect.top + rect.bottom) / 2;      CRect showRect(rect);      showRect.left = ((midW - nWidth / 2) < rect.left) ? rect.left : (midW - nWidth / 2);      showRect.right = ((midW + nWidth / 2) > rect.right) ? rect.right : (midW + nWidth / 2);      showRect.top = ((midH - nHeight / 2) < rect.top) ? rect.top : (midH - nHeight / 2);      showRect.bottom = ((midH + nHeight / 2) > rect.bottom) ? rect.bottom : (midH + nHeight / 2);      if(showRect.left < 0 || showRect.right < 0 || showRect.top < 0 || showRect.bottom < 0) return E_FAIL;      //將圖形輸出到屏幕上(有點(diǎn)像BitBlt)      bResult=pPic->Render(hDC_Temp,showRect.left,showRect.top,showRect.Width(),showRect.Height(),          0,hmHeight,hmWidth,-hmHeight,NULL);      pPic->Release();        file.Close();//關(guān)閉打開的文件      ar.Close();      arcstream.Release();      if (SUCCEEDED(bResult))      {          return S_OK;      }      else      {          return E_FAIL;      }    }  把網(wǎng)絡(luò)圖片下載到本地還有一個(gè)小插曲,開始我使用File Open的方式讀取網(wǎng)絡(luò)圖片,對于有些圖片是管用的。但是GetLength得到的值有時(shí)會(huì)很小,直接導(dǎo)致圖片下載不全,OleLoadPicture的時(shí)候程序直接卡死了。[cpp] view plain copy 在CODE上查看代碼片CString CListListBox::SavePic(CString strImgUrl)  {      //本地緩存路徑      if(path.IsEmpty())          return L"";      DWORD dwFileSize,dwByteRead;        //讀取網(wǎng)頁上圖片文件,實(shí)際是個(gè)CHttpFile指針      CInternetSession session(L"HttpClient");      CStdioFile* httpFile = session.OpenURL(strImgUrl);      if (httpFile!=INVALID_HANDLE_VALUE)      {          for(int i = 0; i < 100; i++)          {              dwFileSize = httpFile->GetLength();//獲取文件字節(jié)數(shù)          }          if (dwFileSize==0xFFFFFFFF)          {              DWORD err = GetLastError();              return L"";          }      }      else      {          return L"";      }        CFile file;      if(file.Open(path,CFile::modeCreate|CFile::modeWrite))      {          while(dwFileSize > 0)          {              BYTE* pvData = new BYTE[dwFileSize];//[100*1024*1024];              memset(pvData, 0, dwFileSize);              dwByteRead = httpFile->Read(pvData,dwFileSize);              file.Write(pvData,dwByteRead);              delete pvData;              dwFileSize -= dwByteRead;          }      }      file.Close();      httpFile->Close();      session.Close();      return path;  }  后來在網(wǎng)上搜了牛人寫的程序直接拿來用,居然很好用,速度也挺快[cpp] view%20plain copy 派生到我的代碼片CString CListListBox::SavePic(CString strImgUrl)  {      DWORD length=0;      BYTE buffer[1024];      memset(buffer,0,1024);      HINTERNET hInternet;        hInternet=InternetOpen(_T("Testing"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);      if (hInternet==NULL)      {          //cout<<_T("Internet open failed!")<<endl;          return L"";      }        HINTERNET hUrl;      hUrl=InternetOpenUrl(hInternet,strImgUrl,NULL,0,INTERNET_FLAG_RELOAD,0);      if (hUrl==NULL)      {          // cout<<_T("Internet open url failed!")<<endl;          InternetCloseHandle(hInternet);          return L"";      }        BOOL hwrite;      DWORD written;      HANDLE hFile;          CString path = CreateLocalPath(strImgUrl);          hFile=CreateFile(path,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);      if (hFile==INVALID_HANDLE_VALUE)      {          //cout<<_T("Create File failed!")<<endl;          InternetCloseHandle(hUrl);          InternetCloseHandle(hInternet);          return L"";      }        BOOL read;      while(1)      {          read=InternetReadFile(hUrl,buffer,sizeof(buffer),&length);          if(length==0)              break;          hwrite=WriteFile(hFile,buffer,sizeof(buffer),&written,NULL);          if (hwrite==0)          {              //cout<<_T("Write to file failed!")<<endl;              CloseHandle(hFile);              InternetCloseHandle(hUrl);              InternetCloseHandle(hInternet);              return L"";          }      }      CloseHandle(hFile);      InternetCloseHandle(hUrl);      InternetCloseHandle(hInternet);      return path;  }  大功告成,由于開發(fā)時(shí)間匆忙,很多細(xì)節(jié)沒有追究,等以后有時(shí)間了再補(bǔ)上,這里做個(gè)記錄吧。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久久久久中文字幕 | www.91操| 亚洲成人黄色片 | 欧美a黄| 午夜爽爽爽男女免费观看hd | 成年人在线视频 | 请播放一级毛片 | 中文字幕网在线 | 91精品国产综合久久婷婷香蕉 | 色就色 综合偷拍区91网 | 激情九九 | 狠狠操电影| 羞羞视频免费观看入口 | 国产午夜精品在线 | 91av网址| 色阁阁69婷婷 | a视频在线播放 | 成人爱爱电影 | 茄子福利视频 | 国产精品久久久不卡 | 香蕉视频网站在线观看 | 激情视频导航 | 国产一级一国产一级毛片 | 亚洲一区二区观看播放 | 成人偷拍片视频在线观看 | 91精品国产99久久久久久红楼 | 亚洲天堂午夜 | 久久久成人精品 | 久久艹精品视频 | 国产噜噜噜噜噜久久久久久久久 | 国产1区2区在线观看 | www.17c亚洲蜜桃 | 国产精品毛片va一区二区三区 | 91精品片 | 色无极影院亚洲 | 欧美一级美国一级 | 一本色道久久99精品综合蜜臀 | 黑人日比 | 成品片a免人视频 | 日本网站一区 | 免费的性生活视频 |