基于VB6.0的數字圖像編程實例
|
前言
隨著編程技術的發展,如何在程序中處理圖像已經是所有編程愛好者不得不面對的一個重要問題,筆者在天極網上曾發表了多篇關于數字圖像處理的文章,但都是基于Visual C++開發平臺的,對于習慣于使用Visual Basic的讀者朋友來說,不能不算是一個遺憾。 網上有很多朋友關心如何在Viusal Basic環境下進行一些基本的圖像處理,如位圖文件數據的讀取、顯示、實現特效等,為了滿足上述這些朋友們的需求,筆者通過這篇文章介紹一下如何在Visual Basic環境下實現圖像文件的一些基本操作,希望可以對廣大喜愛Visual Basic編程的朋友起到入門的作用。
一、BMP位圖的DIB的結構
在 Windows 3.0 以前,Windows系統用的是DDB(設備有關位圖),DDB沒有調色板,顯示的顏色依賴硬件,處理色彩很不方便。所以微軟從Windows 3.0以后重新定義了BMP文件格式,使其支持設備無關位圖--也就是DIB,其結構主要由以下幾個部分構成:1)BITMAPFILEHEADER:BMP文件頭;2)DIB BITMAPINFOHEADER:BMP位圖文件信息頭;3)RGBQUAD[]:BMP位圖的調色板;4)位圖數據塊。BMP文件的結構示意圖如圖一所示:

圖一、位圖文件的結構示意圖
(1)BMP位圖文件頭BITMAPFILEHEADER的VB聲明如下:
| Type BITMAPFILEHEADER bfType(0 to 1) As Byte bfSize As Long bfReserved1 As Integer bfReserved2 As Integer bfOffBits As Long End Type |
上述結構中,參數bfType 指示文件的類型,對于位圖文件來說,它必須是"BM";參數bfSize指示位圖文件的大小,它包括BITMAPFILEHEADER的長度;參數bfReserved1、bfReserved2目前保留,必須等于0;參數bfOffBits表示位圖數據距離文件頭的偏移字節數。
(2)文件信息頭BITMAPINFOHEADER結構在VB中聲明如下:
| Type BITMAPINFOHEADER biSize As Long biWidth As Long biHeight As Long biPlanes As Integer biBitCount As Integer biCompression As Long biSizeImage As Long biXPelsPerMeter As Long biYPelsPerMeter As Long biClrUsed As Long biClrImportant As Long End Type |
上述結構中,參數biSize表示BITMAPINFOHEADER結構的大小;參數biWidth表示位圖的高度,單位是像素;參數biHeight 位圖的寬度,單位是像素;參數biPlanes 設備的位平面數,現在都是1;參數biBitCount 圖像的顏色位數,1表示單色位圖、4表示16色位圖、8表示256色位圖、24表示真彩色位圖、32表示32位位圖,默認情況下Windows不會處理最高8位,可以將它作為自己的Alpha通道;參數biCompression表示圖像的壓縮方式,BI_RGB表示無壓縮、BI_RLE8表示行程編碼壓縮;參數biSizeImage表示實際的位圖數據所占字節;參數biXPelsPerMeter表示目標設備的水平分辨率,單位是每米的像素個數;參數biYPelsPerMeter表示目標設備的垂直分辨率,單位是每米的像素個數;參數biClrUsed表示使用的顏色數(當biBitCount等于1、4、8時才有效),如果該項為0,表示顏色數為2^biBitCount;參數biClrImportant# 重要的顏色數,如果該項為0,表示所有顏色都是重要的。
(3)位圖調色板
調色板實際上是一個數組,它的元素的個數由biBitCount和biClrUsed決定,對于位圖文件來說,只有biBitCount等于1、4、8時才有調色板,它們對應的調色板的元素個數分別是2、16、256。調色板結構在VB中的聲明如下:
| Private Type RGBQUAD rgbBlue As Byte rgbGreen As Byte rgbRed As Byte rgbReserved As Byte End Type |
上述結構中,參數rgbBlue表示藍色分量,參數rgbGreen 綠色分量;參數rgbRed表示紅色分量;參數rgbReserved為保留位,設置為0既可。對于各個顏色的分量來說,它們分布在0-255之間,數值越大,亮度越大,反之則亮度越小。
需要說明的是,BITMAPINFOHEADER結構和調色板數據合在一起就構成了BITMAPINFO結構,這個結構在顯示位圖文件時能夠用到。該結構在VB中聲明如下:
| Private Type BITMAPINFO bmiHeader As BITMAPINFOHEADER bmiColors(0 To 255) As RGBQUAD End Type |
(4)位圖數據
對于位圖文件來說,一行的圖像數據叫做一個掃描行,一個掃描行的長度必須是4的倍數(字節),如果不是,則需要補齊。計算公式:LineBytes=((biWidth*biBitCount+31)And &HFFFFFFE0)8,通常情況下DIB的掃描行是逆序存儲的(相對于屏幕坐標系而言),即屏幕上的第一行是DIB位圖數據的最后一行。對于256色位圖來說,它用8bit表示一個像素的顏色索引,也就是說,位圖顯示時,根據當前索引值來到位圖的調色板中確定該像素的顏色;對于真彩色圖象來說,位圖文件中沒有調色板信息,它直接用24個bit位表示一個像素的顏色,每個字節表示一種基色,也就是R、G、B分量中的一個值,需要注意的是,真彩色位圖文件中三個字節的排列順序是BGR,而不是傳統的RGB。
二、位圖文件的顯示
對位圖文件的結構了解以后,我們就能順利讀取位圖文件中的各種信息,然后結合特定的顯示函數就可以將位圖文件顯示出來,本文中這個特定的顯示函數是StretchDIBits(),它在VB中的聲明如下:
| Declare Function StretchDIBits Lib "gdi32" (ByVal hDC As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal nDestWidth As Long, ByVal nDestHeight As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, lpBits As Any, lpBitsInfo As Any, ByVal wUsage As Long, ByVal dwRop As Long) As Long |
該函數執行成功返回位圖句柄,零表示失敗。其中參數hDC 一個設備場景的句柄,該設備場景定義了要創建的與設備有關位圖的配置信息;參數Xdest為指定繪制區域的左上角X坐標;參數Ydest為指定繪制區域的左上角Y坐標;參數nDestWidth為指定繪制區域的高度;參數nDestHeight為指定繪制區域的寬度;參數XSrc為矩形在DIB中的起點X坐標;參數YSrc 為矩形在DIB中的起點Y坐標;參數nSrcWidth指定原位圖繪制區域的左上角X坐標;參數nSrcHeight指定原位圖繪制區域的左上角Y坐標;參數lpBits 指向一個緩沖區的指針,這個緩沖區包含了以DIB格式描述的位圖數據;lpBitsInfo 指向BITMAPINFO結構,參數iUsage一般情況下等于DIB_RGB_COLORS,表示包含了RGB顏色;參數dwRop表示欲進行的光柵運算,具體內容可以參見MSDN。
當然,顯示位圖文件的函數不只這一個,還有其他的一些函數,具體內容讀者朋友可以參考相關資料。
三、實現位圖的淡入淡出的實例
為了演示如何在Visual Basic中實現數字圖像的基本操作,本文的例子實現了一幅256色彩色位圖淡入淡出的顯示效果,用戶可以通過設定時間的長短控制圖像淡入淡出的速度。例子程序中,有兩個模塊,其中MyMemory模塊是用來申請特定的內存空間,為后續讀取位圖文件作準備,另一模塊Bitmap是用來實現位圖文件數據的讀寫、準備淡入淡出操作時的調色板等。對于例子中的256色彩色位圖來說,實現淡入淡出顯示主要是通過操作圖像的調色板來實現的。具體思路是設置一個數組來存放若干個調色板,其中一個調色板保存位圖文件中的原始調色板數據,另外的調色板中的數據按照比例等間隔的縮小,直至調色板中的R、G、B分量全部為零為止。有了這些預設的調色板,就可以在定時顯示的過程中實現圖像的淡入淡出的效果了。
四、小結
本文介紹了Visual Basic中處理位圖文件的基本知識,提供了示例中實現了位圖文件的讀寫、顯示等基本操作,讀者朋友可以在該代碼的基礎上進行修改、豐富,實現更多更復雜的圖像處理功能,有興趣的朋友可以動手親自實驗一下。
下載本文源代碼