JPG,动态GIF,BMP一些常用解决办法
生活随笔
收集整理的這篇文章主要介紹了
JPG,动态GIF,BMP一些常用解决办法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JPG,動態GIF,BMP一些常用解決辦法
| 常用方式0,使用GIF89A類: 優勢: 一招鮮吃遍天,上至動態GIF,下至靜態JPG,BMP兩句搞定,簡單方便 缺點: 有時會出現邊緣效果, 有的圖像會挺明顯 使用方法: #include "gif89a.h" CGif89a* gif; 在調用函數內添加: gif=new CGif89a(this->m_hWnd); gif->Load("test.gif"); gif->SetPosition(100,100); gif->Play(); //gif->Pause(TRUE); //Pause(TRUE)為暫停GIF的播放 //gif->Pause(FALSE);//Pause(FALSE)為繼續GIF的播放 常用方式1,使用iPicture: 優勢: MS早期的圖片類, 可以顯示所有的靜態圖片, 顯示動態GIF尚需一個GIF的圖象儲存結構gifImage,如果有興趣可以看看薛碧的如何在VC中顯示動態的GIF 缺點: 用戶自主定義不太方便, 薛碧文章是介紹在RC靜態編輯顯示動態GIF的辦法,本來打算改寫一下作個GIF類, 發現了GIF89A, 于是沒作了多余工 調用方法: CString sPath; sPath=_T("1.JPG"); //CDC* pDC = GetDlgItem(IDC_CONTROL)->GetDC();//獲得控件DC CRect zcRect; GetClientRect(&zcRect); ShowJpgGif(pDC,sPath,zcRect.left,zcRect.top,zcRect.Width(),zcRect.Height()); 函數實現 BOOL ShowJpgGif(CDC* pDC,CString strPath, int x, int y ,int Width, int Height) { IStream *pStm; CFileStatus fstatus; CFile file; LONG cb; //打開文件并檢測文件的有效性 if (file.Open(strPath,Cfile&::modeRead)&& file.GetStatus(strPath,fstatus)&& ((cb = fstatus.m_size) != -1)) { HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); LPVOID pvData = NULL; if (hGlobal != NULL) { pvData = GlobalLock(hGlobal); if (pvData != NULL) { file.Read(pvData, cb); GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); } } } else { return false; } //打開文件結束 //顯示JPEG和GIF格式的圖片,GIF只能顯示一幀,還不能顯示動畫, //要顯示動畫GIF請使用ACTIVE控//件。 IPicture *pPic; //load image from file stream if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic))) { OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; pPic->get_Width(&hmWidth); pPic->get_Height(&hmHeight); double fX,fY; //get image height and width fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/ (double)pDC->GetDeviceCaps(HORZSIZE)*100.0; fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/ (double)pDC->GetDeviceCaps(VERTSIZE)*100.0; //use render function display image if(FAILED(pPic->Render(*pDC, x, y, Width, Height,0, hmHeight,hmWidth,-hmHeight,NULL))) { pPic->Release(); return false; } pPic->Release(); } else { return false; } return true; } 常用方式2, 使用MS CImage 優點: MS的最新圖像類,MFC/ATL通用, 應該是可靠的,使用也很簡單方便,較為靈活,目的應該為替代iPicture類 缺點: 還是不能完美的解決動態GIF問題, #include <atlimage.h> CImage m_Image; //pS: 以下插入調用函數 CString strFilter; CSimpleArray<GUID> aguidFileTypes; HRESULT hResult; //CImage m_Image; // 獲取CImage支持的圖像文件的過濾字符串 hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T( "All Image Files")); if (FAILED(hResult)) { MessageBox("GetExporterFilter調用失敗!"); return; } CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter); if(IDOK != dlg.DoModal()) return; m_Image.Destroy(); // 將外部圖像文件裝載到CImage對象中 hResult = m_Image.Load(dlg.GetFileName()); if (FAILED(hResult)) { MessageBox("調用圖像文件失敗!"); return; } // 設置主窗口標題欄內容 CString str; str.LoadString(AFX_IDS_APP_TITLE); AfxGetMainWnd()->SetWindowText(str + " - " +dlg.GetFileName()); Invalidate(); // 強制調用OnDraw //PS: 以下插入重畫函數 void Ctemp7View::OnDraw(CDC* pDC) { Ctemp7Doc* pDoc = Getdocument.); ASSERT_VALID(pDoc); // TODO: 在此處為本機數據添加繪制代碼 if (!m_Image.IsNull()) { CRect zcRect; GetClientRect(&zcRect); m_Image.Draw(pDC->m_hDC,zcRect.left,zcRect.top,zcRect.Width(),zcRect.Height()); } } 本文演示代碼打包下載: PIC_test.rar |
總結
以上是生活随笔為你收集整理的JPG,动态GIF,BMP一些常用解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 早知道就好了!这些编程入门神器,赶紧用起
- 下一篇: 帝国CMS后台前台上传大小和类型限制的解