【正文】
色盤,最后再以新色盤的 256 色取代原圖。 江南大學(xué)學(xué)士學(xué)位論文 5 第二章 BMP 文件 圖像處理中的色彩原理 計算機影像的色彩是經(jīng)由位元( BIT)的計算和組合而來,單純的黑白圖像是最簡單的色彩結(jié)構(gòu),在計算機上用到1位元的資料,雖說只有黑色和白色,但仍能透過疏密的矩陣排列,將黑與白組合成近似視 覺上的灰色調(diào)階。當(dāng)然,也可以在程序中創(chuàng)建全新的對象,并根據(jù)需要不斷完善對象的功能。 類庫 Microsoft 的基本類庫 MFC 使得開發(fā) Windows 應(yīng)用程序比以往任何時候都要容易,MFC 的英文全稱是 Microsoft Fundation Classes, MFC 的本質(zhì)就是一個包含了許多微軟公司已經(jīng)定 義好的對象的類庫,雖然我們要編寫的程序在功能上是千差萬別的,但從本質(zhì)上來講,都可以化歸為用戶界面的設(shè)計,對文件的操作,多媒體的使用,數(shù)據(jù)庫的訪問等等一些最主要的方面。 .h 和 .cpp 文件 在應(yīng)用程序中大量應(yīng)用的是以 h 和 cpp 為擴展名的文件,以 h 為擴展名的文件稱為頭文件。 .clw文件 以 clw 為擴展名的文件是用來存放 應(yīng)用程序中用到的類和資源的信息的,這些信息是 VC 中的 ClassWizard 工具管理和使用類的信息來源。在 Workspace 文件中可以包含多個 Project,由 Workspace 文件對它們進行統(tǒng)一的協(xié)調(diào)和管理。這一部分還包括用VC++實現(xiàn)的代碼。我創(chuàng)建了幾個 DIB 函數(shù),以方便今后程序的調(diào)用。 第一部分我們對 VC++有個概括了解 。圖像處理的技術(shù)有了長足進步。一幅圖像是以像素為基礎(chǔ)的,我們稱之為位圖。因為圖像處理的工程是由 VC++來實現(xiàn)的。 第四部分完全討論的是位圖圖像的處理,比如旋轉(zhuǎn)和平移。 關(guān)鍵詞: BMP 圖像,復(fù)合,透明度, VC++ 江南大學(xué)學(xué)士學(xué)位論文 2 Abstract There is no doubt that image processing have been a focus in the study of puter technology of image processing is developed in a puter a image is call them paper is focus on the processing of bitmap we take two images for example,showing how to apply images. In the first part I give an overall description of Visual C++.Because the project about the processing of bitmap images is realized by Visual C++. In the second part the definition of bitmap image is also discuss types of other image files. The third part starts with DDB definitions .But it is mainly focuses on DIB. I created several functions on we can call them from any part of the program later. The fourth part is devoted to the processing of bitmap images, such as shifting images,rotating use mathematical functions for analysis of image processing. And the effect of applying images is shown by changing the codes in VC++ environment are also in this part. Key words: bitmap image, overlap, transparency, VC++ 江南大學(xué)學(xué)士學(xué)位論文 3 第一章 開發(fā)環(huán)境 Visual C++簡介 為什么使用 VC++來做圖像處理 ? VC++是最適合用來做圖像處理工具了,因為使用 C 語言能很方便的封裝各種復(fù)雜的圖像處理算法,并以類的形式表達(dá)出來,充分利用面向?qū)ο蠹夹g(shù);而且,在 VC 中還可以很方便地使用 Windows GUI 的 API,并利用內(nèi)建 OpenGL SDK 以及 DirectX SDK 來充分支持動畫設(shè)計,當(dāng)然也可 以使用第三方的圖形處理庫來簡化編程;另外,它支持遠(yuǎn)程調(diào)試,這對于圖像處理程序的調(diào)試時非常重要的。 以 cpp 為擴展名的文件稱為實現(xiàn)文件,一般說來 h 為擴展名的文件與 cpp 為擴展名的文件是一一對應(yīng)配合使用的,在 h 為擴展名的文件中包含的主要是類的定義,而在 cpp 為擴展名的文件中包含的主要是類成員函數(shù)的實現(xiàn)代碼。這一點正是微軟提供 MFC 類庫最重要的原因,在這個類庫中包含了一百多個程序開發(fā)過程中最常用到的對象。 正是由于 MFC 編程方法充分利用了面向?qū)ο蠹夹g(shù)的優(yōu)點,它使得我們編程時極少需要關(guān)心對象方法的實現(xiàn)細(xì)節(jié),同時類庫中的各種對象的強大功能足以完成我們程序中的絕大部分所需功能,這使得應(yīng)用程序中程序員所需要編寫的代碼大為減少,有力地保證了程序的良好的可調(diào)試性。 灰階( Grayscale) 的影像共有 256 個階調(diào),看起來類似傳統(tǒng)的黑白照片;除黑、白二色之外,尚有 254 種深淺的灰色,電腦必須以 8 位元的資料,顯示這 256 種階調(diào)。 讓我們看看每一位元色包含多少種顏色: 1 位 2 種顏色 2 位 4 種顏色 4 位 16 種顏色 8 位 256 種顏色 16 位 65536 種顏色 24 位 1677 萬種顏色 32 位 1677 萬種顏 色和 256 級灰度值 36 位 687 億種顏色和 4096 級灰度值 圖像文件格式 格式 這是 Microsoft 開發(fā)的位圖文件格式,為基于 Intel 處理器的計算機運行 MSDOS、江南大學(xué)學(xué)士學(xué)位論文 6 Windows、 Windows NT 等操作系統(tǒng)所支持,甚至有許多的應(yīng)用程序也支持它。 該格式是當(dāng)今應(yīng)用比較廣泛的一種格式。 由于它優(yōu)異的性能,所以應(yīng)用非常廣泛,而在 Inter 上,它更是主流圖形格式。 SVG 被開發(fā)的目的是為 Web 提供非柵格的圖像標(biāo)準(zhǔn)。 DWORD bfSize。 }BITMAPFILEHEADER。 LONG biWidth。 DWORD biCompression。 DWORD biClrUsed。 biSizeImage 為圖像大小的字節(jié)數(shù),它可由文件頭中的其他域計算出,需注意的是每排像素必須在 32 位或其倍數(shù)上結(jié)束,如果一排像素到不了 32 位邊界上則用“ 0”填充其余位; biXPelsPerMeter: 圖像 X 方向的分辨率; biYPelsPerMeter: 圖像 Y 方向的分辨率; biClrUsed: 圖像所使用的顏色數(shù),如果不用置為 0,表示所有的顏色都用到,如果位圖被壓縮,則必須置為 0; biClrImportant: 圖像中重要的顏色數(shù),通常置為 0,表示所有的顏色 都重要; BMP 文件信息頭基本上包含圖像的所有重要的信息,包括寬度、高度、每像素的位數(shù)。需注意的是并不是圖像的高度乘以寬度乘以表示每像素的字節(jié)數(shù)就行了,因為在 BMP 的文件格式中規(guī)定每行的字節(jié)數(shù)必須是 4 的整數(shù)倍,不是 4 的整數(shù)倍的要補 0 補齊到 4 的整數(shù)倍。 調(diào)色板 RGBQUAD 的數(shù)據(jù)結(jié)構(gòu)定義為: typedef struct tagRGBQUAD { BYTE rgbBlue。 //保留,為 0 }RGBQUAD; RGBQUAD 數(shù)據(jù)結(jié)構(gòu)是 BMP 所包含的顏色表,接在 BITMAPINFOHEADER 結(jié)構(gòu)之后含有位圖中用到的用到的每種顏色的 RGB 顏色,在位圖中有多少顏色,就有多少RGBQUAD 數(shù)據(jù)結(jié)構(gòu)項,如果 biClrUsed 的值大于“ 0”,則 biClrUsed 值就是 RGBQUAD元素的數(shù)目。 和 BMP 有關(guān)的數(shù)據(jù)結(jié)構(gòu)還有 BITMAPINFO 結(jié)構(gòu) : 江南大學(xué)學(xué)士學(xué)位論文 9 typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader。 BMP 圖像數(shù)據(jù) BMP 文件中位圖化的圖像數(shù)據(jù)是以連續(xù)行的形式存儲的,并且是以相反的順序存儲,即文件讀出的第一行是圖像的最后一行。 在 24 位色的圖像中,三個字節(jié)按順序分別為藍(lán)、綠、紅,和一般采用的 RGB 即紅綠藍(lán)相反。 江南大學(xué)學(xué)士學(xué)位論文 10 第三章 圖像處理 DIB 的編 程 了解了 BMP 文件的格式后,還需要了解在屏幕上顯示位圖需要什么樣的數(shù)據(jù)結(jié)構(gòu)。在 中BITMAP 數(shù)據(jù)類型的結(jié)構(gòu)定義如下: typedef struct tagBITMAP { int bmType。 BYTE bmPlanes。 其中,各變量的含義為: bmType:位圖類型,應(yīng)設(shè)為 0; bmWidth:位圖以像素為單位的寬度; bmHeight:位圖以像素為單位的高度; bmWidthBytes:每行數(shù)據(jù)的字節(jié)數(shù),必為偶數(shù); bmPlanes:表示設(shè)備的色位面( color plane)數(shù); bmBitsPixel:表示一個像素顏色所需要的位數(shù); bmBits:指向像素數(shù)據(jù)的指針。 DIB DIB 位圖格式由三部分構(gòu)成,即 BITMAPINFOHEADER(文件信息頭)、 RGBQUAD(調(diào)色板入口)和 BITMAPDATA(圖像數(shù)據(jù))構(gòu)成。 DIB 的編 程 DIB(Independent Bitmap) API 函數(shù)庫中的有些重要函數(shù)在以后的程序設(shè)計中經(jīng)常用到,現(xiàn)列舉如下: 1. FindDIBBits() 參數(shù) : LPSTR lpbi //指向 DIB 對象的指針 返回值 : LPSTR //指向 DIB 圖像象素起始位置 說明 : 該函數(shù)計算 DIB 中圖像象素的起始位置,并返回指向它的指針。 對 于 Windows DIB , 返 回BITMAPINFOHEADER中的 biHeight值;對于其它返回 BITMAPCOREHEADER中的 bcHeight 值。對于這種情況,則返回一個近似的數(shù)值。本章就此進行討論。 平移 但是這些變換后的點有可能超出原圖像的范圍。但是該函數(shù)僅局限于處理 BMP 圖像。 HLOCAL hNewDIBBits。 LONG i0。 else if(count= =256) s=1。 江南大學(xué)學(xué)士學(xué)位論文 15 if(s= =3||s= =1) { lLineBytes=WIDTHBYTES(lWidth*8*s)。 if(count= =0) { tag=3。 } hNewDIBBits=LocalAlloc(LHND,lLineBytes*lHeight)。ilHeight。 i0=ilYOffset。(j0lWidth)amp。(i0lHeight)) { lpSrc=(char*)lpDIBBits+lLineBytes*i0+j0*tag。 } } else { 江南大學(xué)學(xué)士學(xué)位論文 16 for(k=0。 LocalUnlock(hNewDIBBits)。效果圖 我們用一幅 BMP 圖像的平移來演示圖像平移前后的情形。有兩種顯示方法,一種是增大圖像的顯示區(qū)域,使旋轉(zhuǎn)后的圖像能完全顯示出來,如圖 44;另一種方法是按原圖像的區(qū)域顯示,將區(qū)域之外的圖像截掉。如要按坐標(biāo)系中的某一點進行旋轉(zhuǎn)。編程實現(xiàn) 在 Graphics_czView 類里添加一個成員函數(shù) InteRotate( )來實現(xiàn)這一圖像變換功能。 LPSTR lpNewDIBB