亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

VC下顯示JPEG、GIF圖像的簡便方法

2019-11-17 05:19:21
字體:
來源:轉載
供稿:網友
摘要:本文講述了在Visual C++ 6.0下顯示JPEG、GIF等格式標準的圖像的一種實現起來比較簡便的方法,對實現過程作有具體的說明。

  要害字:圖像、JPEG、GIF、Microsoft Visual C++ 6.0

  一、 引言

  JPEG圖像壓縮標準隨然是一種有損圖像壓縮標準,但由于人眼視覺的不敏感,經壓縮后的畫質基本沒有發生變化,很快便以較高的壓縮率得到了廣泛的認可。GIF格式雖然僅支持256色但它對于顏色較少的圖像有著很高的壓縮率,甚至超過JPEG標準,也得到了廣泛的認同。但作為眾多程序員的一個重要的開發工具--Microsoft Visual C++ 6.0的MFC庫卻僅對沒有經過任何壓縮的BMP位圖文件有著良好的支持,可以讀取、顯示、存儲甚至在內存中創建一塊內存位圖。由于BMP格式的圖像沒有經過任何的壓縮,不論是作為程序的外部文件,還是作為程序的內部資源都要占據大量的空間,尤其是后者會大大增加可執行文件的長度??梢钥闯?,假如能用經過壓縮、具有較好的壓縮率的JPEG或GIF格式的圖像來取代BMP文件在VC中的應用,無疑還是很有吸引力的。

  二、 設計思路

  雖然有一些操作、處理JPEG、GIF等其他格式圖像的Active X控件,但總的來說使用起來并不太方便,筆者經過實驗摸索,總結出了一種借助于COM接口的OLE方法來實現上述功能的一種簡便方法,現介紹如下以饗廣大讀者:

  下面我們要使用ipicture 的COM接口,有必要對該圖像接口做些了解:該接口主要治理圖像對象及其屬性,圖像對象為 位圖、圖標和圖元等提供一種與語言無關的抽象。和標準的字體對象一樣,系統也提供了對圖像對象的標準實現。其主要的接口是IPicture和IPictureDisp,后者是由IDispatch接口派生以便通過自動化對圖像的屬性進行訪問。圖像對象也支持外部接口IPRopertyNotifySink,以便用戶能在圖像屬性發生改變時作出決定。圖像對象也支持IPersistStream接口,所以它能從一個IStream接口的實例對象保存、裝載自己,而IStream接口也支持對流對象的數據讀寫。

  我們可以用函數OleLoadPicture從包含有圖像數據的流中裝載圖像。該函數簡化了基于流的圖像對象的創建過程,可以創建一個新的圖像對象并且用流中的內容對它進行初始化。其函數原型為:

STDAPI OleLoadPicture( IStream * pStream, //指向包含有圖像數據的流的指針
LONG lSize, //從流中讀取的字節數
BOOL fRunmode, //圖像屬性對應的初值
REFIID riid, //涉及到的接口標識,描述要返回的接口指針的類型
VOID ppvObj // 在rrid中用到的接口指針變量的地址) ;
  三、 具體的實現

  在顯示圖像之前,首先要獲取到圖像文件的存放路徑,這里采用標準的文件打開對話框來選取圖像文件,文件名存放在CString 型的變量m_sPath中:

CFileDialog dlg(TRUE,"jpg","*.jpg",
OFN_HIDEREADONLYOFN_OVERWRITEPROMPT,
"JPEG文件(*.jpg)*.jpgGIF文件(*.gif)*.gif",NULL);
if(dlg.DoModal()==IDOK)
{
 m_sPath=dlg.GetPathName();
 Invalidate();
}
  為簡單計,圖形顯示的代碼直接在視類中的OnDraw中編寫,首先打開文件并判定文件的可用性,并把文件內容放到流接口IStream的對象pStm中:

IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
……
if (file.Open(m_Path,CFile::modeRead)&&file.GetStatus(m_Path,fstatus)&& ((cb = fstatus.m_size) != -1))
{
 HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
 LPVOID pvData = NULL;
 if (hGlobal != NULL)
 {
  if ((pvData = GlobalLock(hGlobal)) != NULL)
  {
   file.ReadHuge(pvData, cb);
   GlobalUnlock(hGlobal);
   CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
  }
 }
}
  然后,就直接調用OleLoadPicture函數從流中裝載圖像:

IPicture *pPic;
……
OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic));
  由于該函數有時會導致失敗,所以應當用SUCCEEDED宏來做一些適當的保護工作,只有在數據裝載成功的前提下才能繼續下面的圖像顯示工作:

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;
 ……
 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);
 if(FAILED(pPic->Render(*pDC,0,0,(DWord)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL))) {
  AfxMessageBox("渲染圖像失敗!");
  pPic->Release();
 }
 else
 AfxMessageBox("從流中裝載圖像失敗!");
}
  其中,顯示工作主要是由IPicture接口對象的Render函數來完成的,該函數主要用來將圖片的指定部分畫到指定的設備環境的指定位置。原型如下:


HRESULT Render( HDC hdc, //渲染圖像用的設備環境句柄
long x, //在hdc上的水平坐標
long y, //在hdc上的垂直坐標
long cx, //圖像寬度
long cy, //圖像高度
OLE_XPOS_HIMETRIC xSrc, //在源圖像上的水平偏移
OLE_YPOS_HIMETRIC ySrc, //在源圖像上的垂直偏移
OLE_XSIZE_HIMETRIC cxSrc,//在源圖像上水平拷貝的數量
OLE_YSIZE_HIMETRIC cySrc,//在源圖像上垂直拷貝的數量
LPCRECT prcWBounds //指向目標圖元設備環境句柄的指針);
  小結:

  到此為止,通過上述代碼已經能夠在程序的客戶區內顯示JPEG、GIF等標準的圖像了,但對于有多幀圖片(即有動畫)的GIF格式的圖像,目前還只能顯示第一幀,如要完整的顯示GIF 動畫的全過程,還需要外部Active X控件的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人一区三区| 久久香蕉精品香蕉| 国产综合在线视频| 欧美在线视频免费| 国产精品日日摸夜夜添夜夜av| 亚洲成人黄色网| 亚洲欧美在线x视频| 亚洲精品国产品国语在线| 亚洲精品欧美一区二区三区| 成人黄色免费网站在线观看| 精品国产依人香蕉在线精品| 国产香蕉精品视频一区二区三区| 久久精品99国产精品酒店日本| 97精品久久久| 久久精品成人欧美大片古装| 91麻豆国产精品| 国产在线98福利播放视频| 欧美裸体xxxx| 正在播放欧美视频| 国产精品一区电影| 91成人在线播放| 欧美精品一区三区| 欧美乱妇高清无乱码| 久久手机精品视频| 久久久久一本一区二区青青蜜月| 亚洲xxxx妇黄裸体| 欧洲日本亚洲国产区| 国自产精品手机在线观看视频| 欧美激情精品久久久久久变态| 成人做爽爽免费视频| 国产精品88a∨| 综合国产在线视频| 一区二区三区黄色| 77777少妇光屁股久久一区| 精品中文视频在线| 亚洲人成电影网站色…| 久久亚洲国产精品成人av秋霞| 精品中文视频在线| 国产玖玖精品视频| 欧美老女人www| 国产精品88a∨| 日韩va亚洲va欧洲va国产| 97香蕉超级碰碰久久免费的优势| 国产精品视频99| 国产一区二区三区网站| 美女久久久久久久| 欧美成人h版在线观看| 黑人狂躁日本妞一区二区三区| 国内成人精品一区| 日韩av日韩在线观看| 国产91久久婷婷一区二区| 欧美肥臀大乳一区二区免费视频| 91精品国产电影| 国产精品自拍偷拍| 欧美激情久久久久久| 韩国欧美亚洲国产| 日韩美女在线观看一区| 日韩黄色av网站| 色yeye香蕉凹凸一区二区av| 亚洲国产欧美一区二区三区久久| 亚洲黄色免费三级| 国产一区二区丝袜| 最近免费中文字幕视频2019| 成人黄色大片在线免费观看| 久久人体大胆视频| 午夜精品美女自拍福到在线| 国产一区二区三区三区在线观看| 美女av一区二区三区| 91国产视频在线| 国产精品第三页| www.午夜精品| 国产一区二区三区在线| 91精品久久久久久久久久另类| 国产精品久久中文| 久久久久五月天| 日韩男女性生活视频| 欧美日韩国产色| 欧美成人精品影院| 国产精品大陆在线观看| 精品毛片网大全| 亚洲女同性videos| 精品高清一区二区三区| 久久精品精品电影网| 亚洲国产精品女人久久久| 中文字幕精品一区久久久久| 国产日韩精品入口| 91精品国产综合久久香蕉的用户体验| 国产成人精品免费视频| 欧美日本在线视频中文字字幕| 欧美激情视频给我| 国产一区二中文字幕在线看| 国产中文日韩欧美| 亚洲精品久久久久久久久久久久| 在线视频欧美日韩| 欧美激情精品久久久久久免费印度| 亚洲欧美制服中文字幕| 久久综合色影院| 日韩欧美在线视频日韩欧美在线视频| 日韩中文字幕欧美| 欧美疯狂xxxx大交乱88av| 最近2019中文字幕第三页视频| 欧美午夜丰满在线18影院| 成人福利网站在线观看| 日本19禁啪啪免费观看www| 高清视频欧美一级| 欧美亚洲另类激情另类| 欧美一级视频在线观看| 国产精品第七影院| 久精品免费视频| 亚洲男女性事视频| 精品久久久久久亚洲国产300| 亚洲性日韩精品一区二区| 亚洲色图校园春色| 中文字幕亚洲字幕| 国产精品视频免费观看www| 午夜伦理精品一区| 亚洲欧美在线一区二区| 久久av红桃一区二区小说| 91午夜理伦私人影院| 91在线精品播放| 91精品国产乱码久久久久久蜜臀| 日韩视频免费在线| www.欧美三级电影.com| 一区二区日韩精品| 国产精国产精品| 欧美老女人bb| 26uuu日韩精品一区二区| y97精品国产97久久久久久| 国产精品女视频| 欧洲成人在线观看| 九九热在线精品视频| 国产精品久久91| 欧美电影《睫毛膏》| 亚洲精品视频在线播放| 精品国产一区二区三区久久狼黑人| 国产精品亚洲自拍| 欧美与黑人午夜性猛交久久久| 精品久久国产精品| 岛国视频午夜一区免费在线观看| 激情av一区二区| 久久精品国产一区二区电影| 精品中文视频在线| 亚洲精品久久在线| 亚洲伊人久久大香线蕉av| 久久久国产精品x99av| 亚洲丝袜在线视频| 国产精品丝袜视频| 欧美日韩国产一区中文午夜| 成人欧美一区二区三区黑人孕妇| 2019最新中文字幕| 性欧美亚洲xxxx乳在线观看| 亚洲一区二区三区香蕉| 国产精品www| 亚洲另类激情图| 中文字幕日韩av电影| 亚洲电影中文字幕| 亚洲国产精品专区久久| 91精品视频免费| 欧美高清性猛交| 亚洲最大成人网色| 欧美中文字幕视频| 国产精品日本精品| 成人午夜一级二级三级| 国产综合香蕉五月婷在线|