第4章 圖像的存取、顯示與生成(本科生)_第1頁(yè)
第4章 圖像的存取、顯示與生成(本科生)_第2頁(yè)
第4章 圖像的存取、顯示與生成(本科生)_第3頁(yè)
第4章 圖像的存取、顯示與生成(本科生)_第4頁(yè)
第4章 圖像的存取、顯示與生成(本科生)_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第4章

圖像的存取、顯示與生成

14.1.3CImage類(lèi)(1)CImage是VisualC++.NET中MFC的一個(gè)類(lèi)CImage類(lèi)使圖形、圖像軟件的開(kāi)發(fā)跨越了DDB與DIB概念,使處理更為簡(jiǎn)潔、方便CImage類(lèi)提供了讀入和保存BMP、JPEG、GIF、TIF與PNG等格式圖像的能力CImage可以直接使用Windows提供的圖形功能

24.1.3CImage類(lèi)(2)使用CImage時(shí),必須包含atlimage.h文件。可在stdafx.h文件的末尾添加#include<atlimage.h>.3CImage類(lèi)成員函數(shù)-創(chuàng)建與刪除Create

創(chuàng)建一個(gè)DIB位圖與已有CImage對(duì)象相連接Destroy

位圖與CImage對(duì)象相分離并予刪除4CImage類(lèi)成員函數(shù)-輸入與輸出Load

讀入指定圖像文件中的圖像Save

按指定類(lèi)型保存圖像,文件名中不能省略后綴5CImage類(lèi)成員函數(shù)-位圖參數(shù)

GetWidth

返回當(dāng)前圖像的寬度(以像素為單位)GetHeight

返回當(dāng)前圖像的高度GetBPP

返回當(dāng)前圖像的每像素位數(shù)(顏色的深度)GetPixelAddress

返回指定像素?cái)?shù)據(jù)存放位置的存儲(chǔ)地址GetMaxColorTableEntries

返回調(diào)色板單元數(shù)IsIndexed

判別位圖中是否有調(diào)色板6CImage類(lèi)成員函數(shù)-圖形繪制GetDC

返回當(dāng)前位圖的設(shè)備描述表ReleaseDC

釋放設(shè)備描述表GetPixel

返回指定位置像素的顏色SetPixel

設(shè)置指定位置像素的顏色SetPixelRGB

設(shè)置指定位置像素的紅綠藍(lán)分量GetColorTable

獲取調(diào)色板顏色分量(紅、綠、藍(lán))值SetColorTable

設(shè)置調(diào)色板顏色分量(紅、綠、藍(lán))值7CImage類(lèi)成員函數(shù)-位圖塊傳送BitBlt

位圖的一個(gè)矩形區(qū)域復(fù)制到另一位圖上的指定區(qū)域StretchBlt

從源矩形拷貝到目標(biāo)矩形,支持伸縮84.1.5圖像文件的輸入與輸出CImage類(lèi)讀入圖象數(shù)據(jù)的成員函數(shù):HRESULTLoad(LPCTSTRpszFileName)throw();例如:WorkCanvus.Load(m_FileName);CImage類(lèi)保存圖象數(shù)據(jù)的成員函數(shù):HRESULTSave(IStream*pStream,REFGUIDguidFileType)constthrow();9讀入圖象文件并顯示圖象的步驟(1)建立CImage對(duì)象,例如WorkCanvus(2)在“打開(kāi)文件”菜單處理程序OnFileOpen()函數(shù)中用WorkCanvus的Load()成員函數(shù)將圖像文件里的圖象數(shù)據(jù)讀入到WorkCanvus中(3)在菜單“顯示工作畫(huà)布”處理程序OnDisplayWorkcanvus()中用WorkCanvus的Bitblt()函數(shù)將WorkCanvus中的圖象數(shù)據(jù)傳送到畫(huà)布(例如CClientDC或pDC)上WorkCanvus圖像文件Load()Bitblt()畫(huà)布10打開(kāi)圖像文件-OnFileOpen()菜單:“文件/打開(kāi)”源文件:CImageDoc.cpp函數(shù):OnFileOpen()步驟:(1)添加CImage類(lèi)的全局對(duì)象WorkCanvus,并在stdafx.h中將WorkCanvus說(shuō)明為外部對(duì)象externCImageWorkCanvus;(2)添加CImageDoc類(lèi)的事件ID_FILE_OPEN的處理函數(shù)voidCImageDoc::OnFileOpen()(3)在CImageDoc::OnFileOpen()函數(shù)中編寫(xiě)程序由對(duì)話框輸入圖像文件名根據(jù)文件名從圖像文件中讀入圖像數(shù)據(jù)到CImage類(lèi)的對(duì)象WorkCanvus中并設(shè)置最近打開(kāi)的文件名11ProgramCImageDoc.cpp-OnFileOpen()voidCImageDoc::OnFileOpen(){。。。 CFileDialogdlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST,strFilter); hResult=(int)dlg.DoModal();//由對(duì)話框輸入圖像文件名 m_FileName=dlg.GetFileName();//保存當(dāng)前文件名 hResult=WorkCanvus.Load(m_FileName);//根據(jù)文件名從圖像文件中讀入圖像數(shù)據(jù)到CImage類(lèi)的對(duì)象WorkCanvus中

SetPathName(m_FileName,1);//設(shè)置最近打開(kāi)的文件名

UpdateAllViews(NULL); //調(diào)用OnDraw顯示圖象}12保存圖像文件(1)菜單:“文件/另存為”源文件:CImageDoc.cpp函數(shù):OnFileSaveAs()步驟:(1)添加CImageDoc類(lèi)的事件ID_FILE_SAVE_AS的處理函數(shù)voidCImageDoc::OnFileSaveAs()(3)在CImageDoc::OnFileSaveAs()函數(shù)中編寫(xiě)程序:由對(duì)話框輸入圖像文件名根據(jù)文件名將CImage類(lèi)的對(duì)象WorkCanvus中的圖像數(shù)據(jù)保存到圖像文件中去13保存圖像文件(2)voidCImageDoc::OnFileSaveAs(){… CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_EXPLORER,strFilter); hResult=(int)dlg.DoModal();//由對(duì)話框輸入文件名 hResult=WorkCanvus.Save(strFileName);}14顯示CImage類(lèi)對(duì)象中的圖象菜單:“畫(huà)布操作/顯示工作畫(huà)布”源文件:CImageView.cpp函數(shù):OnDisplayWorkcanvus()voidDrawWorkCanvus(CDC*pDC){… CClientDC dc(this); int nXDest,nYDest,nWidth,nHeight,nXSrc,nYSrc; nXSrc=0; nYSrc=0; nXDest=0; nYDest=0; nWidth=WorkCanvus.GetWidth(); nHeight=WorkCanvus.GetHeight(); WorkCanvus.BitBlt(dc,nXDest,nYDest,nWidth,nHeight,nXSrc,nYSrc,SRCCOPY);}154.2畫(huà)布畫(huà)布是一個(gè)將圖像作為二維像素?cái)?shù)組存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)屏幕畫(huà)布屏幕上Windows窗口中的客戶區(qū)可通過(guò)新建CClientDC的對(duì)象來(lái)創(chuàng)建屏幕畫(huà)布利用OnDraw()函數(shù)中的參數(shù)pDC來(lái)創(chuàng)建屏幕畫(huà)布內(nèi)存畫(huà)布建立一個(gè)或多個(gè)CImage對(duì)象來(lái)創(chuàng)建內(nèi)存畫(huà)布畫(huà)布可用作雙緩存技術(shù)克服屏幕畫(huà)面的閃爍164.2.1-2CImage對(duì)象的創(chuàng)建BOOLCreate(intnWidth,intnHeight,intnBPP,DWORDdwFlags=0)throw();nWidth

ThewidthoftheCImagebitmap,inpixels.nHeight

TheheightoftheCImagebitmap,inpixels.IfnHeightispositive,thebitmapisabottom-upDIBanditsoriginisthelowerleftcorner.IfnHeightisnegative,thebitmapisatop-downDIBanditsoriginistheupperleftcorner.nBPP

Thenumbersofbitsperpixelinthebitmap.Usually4,8,16,24,or32.Canbe1formonochromebitmapsormasks.dwFlags

Specifiesifthebitmapobjecthasanalphachannel.Canbeacombinationofzeroormoreofthefollowingvalues:174.2.1-3CImage對(duì)象轉(zhuǎn)換成CDC對(duì)象

CDC中有大量繪圖函數(shù),那么如何用CDC類(lèi)的成員函數(shù)在CImage對(duì)象上繪圖?從CImage對(duì)象取得HDC設(shè)備描述表,再轉(zhuǎn)換成CDC對(duì)象,例如CImageWorkCanvus;…CDC*pDC;pDC=CDC::FromHandle(WorkCanvus.GetDC());//獲取CDC指針pDC->SetPixel(x,y,(COLORREF)n);//CDC上的各種繪圖操作

WorkCanvus.ReleaseDC();//釋放HDC184.2.2窗口刷新Windows通過(guò)調(diào)用OnDraw()函數(shù)刷新窗口何時(shí)需要刷新窗口?系統(tǒng)需要,例如系統(tǒng)改變窗口的尺寸程序需要,例如程序要重畫(huà),可調(diào)用Invalidate()使窗口失效.Invalidate()可以使整個(gè)窗口失效進(jìn)行重繪,也可定義一個(gè)矩形區(qū)域只使一個(gè)區(qū)域內(nèi)部某些地方失效刷新時(shí)全部清除失效區(qū)域后,再重新開(kāi)始繪制新的畫(huà)面,故在執(zhí)行過(guò)程中會(huì)看到屏幕有一次閃動(dòng)刷新窗口的方法重新繪制,即將形成當(dāng)前圖像畫(huà)面的過(guò)程再重復(fù)一遍備份復(fù)貼,即將當(dāng)前的屏幕畫(huà)面存儲(chǔ)起來(lái)作為備份,刷新時(shí)將備份粘貼到屏幕上194.2.3演示程序中一些畫(huà)布的設(shè)置工作畫(huà)布--用于存放需要進(jìn)行處理的圖像CImage對(duì)象,名為WorkCanvus副本畫(huà)布--保存圖像,必要時(shí)把副本畫(huà)布恢復(fù)到工作畫(huà)布中去CImage對(duì)象,名為SaveCanvus屏幕畫(huà)布--即屏幕窗口CClientDC的對(duì)象,例如dcCDC類(lèi)的指針,例如pDCWorkCanvusSaveCanvus屏幕畫(huà)布204.3.1-4位圖的復(fù)制CImage類(lèi)對(duì)象之間的復(fù)制功能不可以用賦值來(lái)實(shí)現(xiàn)。因此,編寫(xiě)了CopyImage()函數(shù)來(lái)實(shí)現(xiàn)兩個(gè)CImage對(duì)象間數(shù)據(jù)的復(fù)制菜單:“畫(huà)布操作/工作畫(huà)布復(fù)制到副本畫(huà)布”源文件:第四章圖象顯示.cpp函數(shù):CopyImage()21voidCopyImage(CImage*pNewImg,CImage*pImage){ RGBQUAD ColorTabs[256]; BYTE *pPixels,*pNewPixels; CDC *pDC,*pNewDC; ... nWidth=pImage->GetWidth(); nHeight=pImage->GetHeight(); nBitsPerPixel=pImage->GetBPP(); nColorTableEntries=pImage->GetMaxColorTableEntries(); if(!pNewImage->IsNull()) pNewImage->Destroy(); pNewImage->Create(nWidth,nHeight,nBitsPerPixel,0); if(nColorTableEntries>0){ pImage->GetColorTable(0,nColorTableEntries,ColorTabs); pNewImage->SetColorTable(0,nColorTableEntries,ColorTabs); } pDC=CDC::FromHandle(pImage->GetDC()); pNewDC=CDC::FromHandle(pNewImage->GetDC()); pNewDC->BitBlt(0,0,nWidth,nHeight,pDC,0,0,SRCCOPY); pImage->ReleaseDC(); pNewImage->ReleaseDC();}22像素的整行復(fù)制為了能快速?gòu)?fù)制這些像素?cái)?shù)據(jù),可使用內(nèi)存拷貝函數(shù)memcpy來(lái)復(fù)制像素void*memcpy(void*dest,constvoid*src,size_tcount);dest Newbuffersrc Buffertocopyfromcount

Numberofcharacterstocopy例如:將第y1行像素?cái)?shù)據(jù)整行復(fù)制到y(tǒng)2行nBytesPerLine=GetBytesPerLine(pImage);//整行像素?cái)?shù)據(jù)字節(jié)數(shù)pPixel=(BYTE*)pImage->GetPixelAddress(0,y1);pNewPixel=(BYTE*)pNewImage->GetPixelAddress(0,y2);memcpy(pNewPixel,pPixel,nBytesPerLine);

pPixel是y1行像素?cái)?shù)據(jù)的首地址pNewPixel是y2行像素?cái)?shù)據(jù)的首地址234.4.4改變調(diào)色板灰階調(diào)色板藍(lán)階調(diào)色板默認(rèn)調(diào)色板24灰階調(diào)色板調(diào)色板單元各分量的強(qiáng)度相等,色彩呈現(xiàn)灰色,分量值與單元序號(hào)成正比

30000111122223333255255255255333調(diào)色板內(nèi)存圖象數(shù)據(jù)圖象顯示顏色25設(shè)置灰階調(diào)色板源文件:第四章圖象顯示.cpp

函數(shù):OnSetGrayPalette()voidCImageView::OnSetGrayPalette(){

RGBQUAD

ColorTab; ... for(inti=0;i<256;i++)//設(shè)置灰階調(diào)色板 {

ColorTab.rgbRed=i;

ColorTab.rgbGreen=i;

ColorTab.rgbBlue=i;

SaveCanvus.SetColorTable(i,1,&ColorTab); } ...}26藍(lán)階調(diào)色板與灰階調(diào)色板相似,它只保留藍(lán)分量,而將紅、綠分量全部設(shè)置為0

3RGB000010012002300325500255003調(diào)色板內(nèi)存圖象數(shù)據(jù)圖象顯示顏色27設(shè)置藍(lán)階調(diào)色板源文件:第四章圖象顯示.cpp函數(shù):OnSetBluePalette()voidCImageView::OnGrayPalette(){

RGBQUADColorTab; ... for(inti=0;i<256;i++)//設(shè)置灰階調(diào)色板 {

ColorTab.rgbRed=0;

ColorTab.rgbGreen=0;

ColorTab.rgbBlue=i; SaveCanvus.SetColorTable(i,1,&ColorTab); } ...}28默認(rèn)調(diào)色板(1)自定義了一個(gè)默認(rèn)調(diào)色板,提供一組典型的顏色組合

30123255003調(diào)色板內(nèi)存圖象數(shù)據(jù)圖象顯示顏色序號(hào)顏色數(shù)內(nèi)容0~78黑、藍(lán)、綠、青、紅、品紅、褐色、淡灰8~158深灰、亮藍(lán)、亮綠、亮青、亮紅、亮品紅、黃、白16~3116灰階,從黑到白16個(gè)等級(jí)32~10372高亮彩色(高飽和、中飽和、低飽和各24種色調(diào))104~17572中亮彩色(高飽和、中飽和、低飽和各24種色調(diào))176~24772低亮彩色(高飽和、中飽和、低飽和各24種色調(diào))248~2558黑色29默認(rèn)調(diào)色板(2)序號(hào)顏色數(shù)內(nèi)容0~78黑、藍(lán)、綠、青、紅、品紅、褐色、淡灰8~158深灰、亮藍(lán)、亮綠、亮青、亮紅、亮品紅、黃、白16~3116灰階,從黑到白16個(gè)等級(jí)32~10372高亮彩色(高飽和、中飽和、低飽和各24種色調(diào))104~17572中亮彩色(高飽和、中飽和、低飽和各24種色調(diào))176~24772低亮彩色(高飽和、中飽和、低飽和各24種色調(diào))248~2558黑色RGBQUAD

DefaultPalette[256]={{0x00,0x00,0x00,0x00},{0xa8,0x00,0x00,0x00},{0x00,0xa8,0x00,0x00}, {0xa8,0xa8,0x00,0x00},{0x00,0x00,0xa8,0x00},{0xa8,0x00,0xa8,0x00}, {0x00,0x54,0xa8,0x00},{0xa8,0xa8,0xa8,0x00},{0x54,0x54,0x54,0x00}, {0xfc,0x54,0x54,0x00},{0x54,0xfc,0x54,0x00},{0xfc,0

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論