摘要
雖然 java 提供了幾種打開圖像的機制,但保存圖像并不是它的強項。這篇技巧將講述如何將圖像保存在 24 位位圖文件中。另外,Jean-Pierre 還提供了將圖像文件寫入位圖文件所需的全部代碼。
這篇技巧是 "在 Java 應用程序中加載位圖文件的逐步指南" 的補充,那篇技巧說明了在 Java 應用程序中加載位圖文件的過程。本月我再提供一篇教程,說明如何將圖像保存在 24 位位圖文件中,其中還包含將圖像對象寫入位圖文件的代碼片斷。
假如您在 Microsoft Windows 環境中工作,那么創建位圖文件的功能將為您提供許多方便。例如,在我的上一個項目中,我必須將 Java 與 Microsoft access 對接。Java 程序答應用戶在屏幕上繪圖。這幅圖隨后被打印到 Microsoft Access 報表中。由于 Java 不支持 OLE,我的唯一選擇就是創建該圖的一個位圖文件,并通知 Microsoft Access 報表在何處能找到這個位圖文件。假如您寫過向剪貼板發送圖像的應用程序,則這個技巧可能對您有用 -- 尤其是當您將這個信息傳遞給另一個應用程序時。
位圖文件的格式
位圖文件格式支持 4 位 RLE(行程長度編碼)以及 8 位和 24 位編碼。因為我們只處理 24 位格式,所以下面我們查看一下該文件的結構。
位圖文件分為三個部分。我已將它們列在下面。
第 1 部分:位圖文件的標頭
標頭包含位圖文件的類型大小信息和版面信息。結構如下(摘自 C 語言結構定義):
typedef strUCt tagBITMAPFILEHEADER {
UINT bfType;
DWord bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;
}BITMAPFILEHEADER;
下面是對這個清單中的代碼元素的說明:
bfType:指定文件類型,其值始終為 BM。
bfSize:指定整個文件的大小(以字節為單位)。
bfReserved1:保留 -- 必須為 0。
bfReserved2:保留 -- 必須為 0。
bfOffBits:指定從 BitmapFileHeader 到圖像首部的字節偏移量。
現在您已經明白位圖標頭的用途就是標識位圖文件。讀取位圖文件的每個程序都使用位圖標頭來進行文件驗證。
第 2 部分:位圖信息標頭
隨后的標頭稱為信息標頭,其中包含圖像本身的屬性。
下面說明如何指定 Windows 3.0(或更高版本)設備獨立位圖 (DIB) 的大小和顏色格式:
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biplanes;
WORD biBitCount;
DWORD biComPRession;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
以上代碼清單的每個元素說明如下:
biSize:指定 BITMAPINFOHEADER 結構所需的字節數。
biWidth:指定位圖的寬度(以象素為單位)。
biHeight:指定位圖的高度(以象素為單位)。
biPlanes:指定目標設備的位面數。這個成員變量的值必須為 1。
biBitCount:指定每個象素的位數。其值必須為 1、4、8 或 24。
biCompression:指定壓縮位圖的壓縮類型。在 24 位格式中,該變量被設置為 0。
biSizeImage:指定圖像的大小(以字節為單位)。假如位圖的格式是 BI_RGB,則將此成員變量設置為 0 是有效的。
biXPelsPerMeter:為位圖指定目標設備的水平分辨率(以“象素/米”為單位)。應用程序可用該值從最符合當前設備特征的資源群組中選擇一個位圖。
biYPelsPerMeter:為位圖指定目標設備的垂直分辨率(以“象素/米”為單位)。
biClrUsed:指定位圖實際所用的顏色表中的顏色索引數。假如 biBitCount 設為 24,則 biClrUsed 指定用來優化 Windows 調色板性能的參考顏色表。
biClrImportant:指定對位圖的顯示有重要影響的顏色索引數。假如此值為 0,則所有顏色都很重要。
現在已定義了創建圖像所需的全部信息。
第 3 部分:圖像
在 24 位格式中,圖像中的每個象素都由存儲為 BRG 的三字節 RGB 序列表示。每個掃描行都被補足到 4 位。為了使這個過程稍復雜一點,圖像是自底而上存儲的,即第一個掃描行是圖像中的最后一個掃描行。下圖顯示了標頭 (BITMAPHEADER) 和 (BITMAPINFOHEADER) 以及部分圖像。各個部分由垂線分隔:
新聞熱點
疑難解答