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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第4章

圖像的存取、顯示與生成

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

24.1.3CImage類(2)使用CImage時,必須包含atlimage.h文件??稍趕tdafx.h文件的末尾添加#include<atlimage.h>.3CImage類成員函數(shù)-創(chuàng)建與刪除Create

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

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

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

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

GetWidth

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

返回當前圖像的高度GetBPP

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

返回指定像素數(shù)據(jù)存放位置的存儲地址GetMaxColorTableEntries

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

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

返回當前位圖的設備描述表ReleaseDC

釋放設備描述表GetPixel

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

設置指定位置像素的顏色SetPixelRGB

設置指定位置像素的紅綠藍分量GetColorTable

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

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

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

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

SetPathName(m_FileName,1);//設置最近打開的文件名

UpdateAllViews(NULL); //調(diào)用OnDraw顯示圖象}12保存圖像文件(1)菜單:“文件/另存為”源文件:CImageDoc.cpp函數(shù):OnFileSaveAs()步驟:(1)添加CImageDoc類的事件ID_FILE_SAVE_AS的處理函數(shù)voidCImageDoc::OnFileSaveAs()(3)在CImageDoc::OnFileSaveAs()函數(shù)中編寫程序:由對話框輸入圖像文件名根據(jù)文件名將CImage類的對象WorkCanvus中的圖像數(shù)據(jù)保存到圖像文件中去13保存圖像文件(2)voidCImageDoc::OnFileSaveAs(){… CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_EXPLORER,strFilter); hResult=(int)dlg.DoModal();//由對話框輸入文件名 hResult=WorkCanvus.Save(strFileName);}14顯示CImage類對象中的圖象菜單:“畫布操作/顯示工作畫布”源文件: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畫布畫布是一個將圖像作為二維像素數(shù)組存儲的數(shù)據(jù)結(jié)構屏幕畫布屏幕上Windows窗口中的客戶區(qū)可通過新建CClientDC的對象來創(chuàng)建屏幕畫布利用OnDraw()函數(shù)中的參數(shù)pDC來創(chuàng)建屏幕畫布內(nèi)存畫布建立一個或多個CImage對象來創(chuàng)建內(nèi)存畫布畫布可用作雙緩存技術克服屏幕畫面的閃爍164.2.1-2CImage對象的創(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對象轉(zhuǎn)換成CDC對象

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

WorkCanvus.ReleaseDC();//釋放HDC184.2.2窗口刷新Windows通過調(diào)用OnDraw()函數(shù)刷新窗口何時需要刷新窗口?系統(tǒng)需要,例如系統(tǒng)改變窗口的尺寸程序需要,例如程序要重畫,可調(diào)用Invalidate()使窗口失效.Invalidate()可以使整個窗口失效進行重繪,也可定義一個矩形區(qū)域只使一個區(qū)域內(nèi)部某些地方失效刷新時全部清除失效區(qū)域后,再重新開始繪制新的畫面,故在執(zhí)行過程中會看到屏幕有一次閃動刷新窗口的方法重新繪制,即將形成當前圖像畫面的過程再重復一遍備份復貼,即將當前的屏幕畫面存儲起來作為備份,刷新時將備份粘貼到屏幕上194.2.3演示程序中一些畫布的設置工作畫布--用于存放需要進行處理的圖像CImage對象,名為WorkCanvus副本畫布--保存圖像,必要時把副本畫布恢復到工作畫布中去CImage對象,名為SaveCanvus屏幕畫布--即屏幕窗口CClientDC的對象,例如dcCDC類的指針,例如pDCWorkCanvusSaveCanvus屏幕畫布204.3.1-4位圖的復制CImage類對象之間的復制功能不可以用賦值來實現(xiàn)。因此,編寫了CopyImage()函數(shù)來實現(xiàn)兩個CImage對象間數(shù)據(jù)的復制菜單:“畫布操作/工作畫布復制到副本畫布”源文件:第四章圖象顯示.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像素的整行復制為了能快速復制這些像素數(shù)據(jù),可使用內(nèi)存拷貝函數(shù)memcpy來復制像素void*memcpy(void*dest,constvoid*src,size_tcount);dest Newbuffersrc Buffertocopyfromcount

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

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

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

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

RGBQUAD

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

ColorTab.rgbRed=i;

ColorTab.rgbGreen=i;

ColorTab.rgbBlue=i;

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

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

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

ColorTab.rgbRed=0;

ColorTab.rgbGreen=0;

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

30123255003調(diào)色板內(nèi)存圖象數(shù)據(jù)圖象顯示顏色序號顏色數(shù)內(nèi)容0~78黑、藍、綠、青、紅、品紅、褐色、淡灰8~158深灰、亮藍、亮綠、亮青、亮紅、亮品紅、黃、白16~3116灰階,從黑到白16個等級32~10372高亮彩色(高飽和、中飽和、低飽和各24種色調(diào))104~17572中亮彩色(高飽和、中飽和、低飽和各24種色調(diào))176~24772低亮彩色(高飽和、中飽和、低飽和各24種色調(diào))248~2558黑色29默認調(diào)色板(2)序號顏色數(shù)內(nèi)容0~78黑、藍、綠、青、紅、品紅、褐色、淡灰8~158深灰、亮藍、亮綠、亮青、亮紅、亮品紅、黃、白16~3116灰階,從黑到白16個等級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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論