熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

Java 技巧:用 Java 保存位圖文件

2013-11-15 09:50:52  來源: JSP教程 

  如果您在 Microsoft Windows 環境中工作那麼創建位圖文件的功能將為您提供許多方便例如在我的上一個項目中我必須將 Java 與 Microsoft Access 對接Java 程序允許用戶在屏幕上繪圖這幅圖隨後被打印到 Microsoft Access 報表中由於 Java 不支持 OLE我的唯一選擇就是創建該圖的一個位圖文件並通知 Microsoft Access 報表在何處能找到這個位圖文件如果您寫過向剪貼板發送圖像的應用程序則這個技巧可能對您有用 尤其是當您將這個信息傳遞給另一個應用程序時
  
  位圖文件的格式
  位圖文件格式支持 位 RLE(行程長度編碼)以及 位和 位編碼因為我們只處理 位格式所以下面我們查看一下該文件的結構
  
  位圖文件分為三個部分我已將它們列在下面
  
   部分位圖文件的標頭
  標頭包含位圖文件的類型大小信息和版面信息結構如下(摘自 C 語言結構定義)
  
  typedef struct tagBITMAPFILEHEADER {
  牋燯INT bfType;
  牋燚WORD bfSize;
  牋燯INT bfReserved;
  牋燯INT bfReserved;
  牋燚WORD bfOffBits;
  }BITMAPFILEHEADER;
  
  
  下面是對這個清單中的代碼元素的說明
  
  
  bfType指定文件類型其值始終為 BM
  
  bfSize指定整個文件的大小(以字節為單位)
  
  bfReserved保留 必須為
  
  bfReserved保留 必須為
  
  bfOffBits指定從 BitmapFileHeader 到圖像首部的字節偏移量
  
  現在您已經明白位圖標頭的用途就是標識位圖文件讀取位圖文件的每個程序都使用位圖標頭來進行文件驗證
  
   部分位圖信息標頭
  隨後的標頭稱為信息標頭其中包含圖像本身的屬性
  
  下面說明如何指定 Windows (或更高版本)設備獨立位圖 (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指定目標設備的位面數這個成員變量的值必須為
  
  biBitCount指定每個象素的位數 其值必須為
  
  biCompression指定壓縮位圖的壓縮類型 位格式中該變量被設置為
  
  biSizeImage指定圖像的大小(以字節為單位)如果位圖的格式是 BI_RGB則將此成員變量設置為 是有效的
  
  biXPelsPerMeter為位圖指定目標設備的水平分辨率(以象素/米為單位)應用程序可用該值從最符合當前設備特征的資源群組中選擇一個位圖
  
  biYPelsPerMeter為位圖指定目標設備的垂直分辨率(以象素/米為單位)
  
  biClrUsed指定位圖實際所用的顏色表中的顏色索引數如果 biBitCount 設為 則 biClrUsed 指定用來優化 Windows 調色板性能的參考顏色表
  
  biClrImportant指定對位圖的顯示有重要影響的顏色索引數如果此值為 則所有顏色都很重要
  
  現在已定義了創建圖像所需的全部信息
  
   部分圖像
  在 位格式中圖像中的每個象素都由存儲為 BRG 的三字節 RGB 序列表示每個掃描行都被補足到 為了使這個過程稍復雜一點圖像是自底而上存儲的即第一個掃描行是圖像中的最後一個掃描行下圖顯示了標頭 (BITMAPHEADER) 和 (BITMAPINFOHEADER) 以及部分圖像各個部分由垂線分隔
  
   D B |
   E
   B EC EC
   | FFFF FFFF FFFF FFFF FFFF
   FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
  *
  
  現在我們開始檢視代碼
  現在我們已經知道了 位位圖文件的結構下面就是您期待已久的內容用來將圖像對象寫入位圖文件的代碼
  
  import javaawt*;
  import javaio*;
  import javaawtimage*;
  
  public class BMPFile extends Component {
  
  牋// 私有常量
  牋private final static int BITMAPFILEHEADER_SIZE = ;
  牋private final static int BITMAPINFOHEADER_SIZE = ;
  
  牋// 私有變量聲明
  
  牋// 位圖文件標頭
  牋private byte bitmapFileHeader [] = new byte [];
  牋private byte bfType [] = {B M};
  牋private int bfSize = ;
  牋private int bfReserved = ;
  牋private int bfReserved = ;
  牋private int bfOffBits = BITMAPFILEHEADER_SIZE + BITMAPINFOHEADER_SIZE;
  
  牋// 位圖信息標頭
  牋private byte bitmapInfoHeader [] = new byte [];
  牋private int biSize = BITMAPINFOHEADER_SIZE;
  牋private int biWidth = ;
  牋private int biHeight = ;
  牋private int biPlanes = ;
  牋private int biBitCount = ;
  牋private int biCompression = ;
  牋private int biSizeImage = x;
  牋private int biXPelsPerMeter = x;
  牋private int biYPelsPerMeter = x;
  牋private int biClrUsed = ;
  牋private int biClrImportant = ;
  
  牋// 位圖原始數據
  牋private int bitmap [];
  
  牋// 文件部分
  牋private FileOutputStream fo;
  
  牋// 缺省構造函數
  牋public BMPFile() {
  
  牋}
  
  
  牋public void saveBitmap (String parFilename Image parImage int
  parWidth int parHeight) {
  
  牋牋爐ry {
  牋牋牋牋fo = new FileOutputStream (parFilename);
  牋牋牋牋save (parImage parWidth parHeight);
  牋牋牋牋foclose ();
  牋牋爙
  牋牋燾atch (Exception saveEx) {
  牋牋牋牋saveExprintStackTrace ();
  牋牋爙
  
  牋}
  
  牋/*
  牋? saveMethod 是該進程的主方法該方法
  牋? 將調用 convertImage 方法以將內存圖像轉換為
  牋? 字節數組writeBitmapFileHeader 方法創建並寫入
  牋? 位圖文件標頭writeBitmapInfoHeader 創建
  牋? 信息標頭writeBitmap 寫入圖像
  牋?
  牋?/
  牋private void save (Image parImage int parWidth int parHeight) {
  
  牋牋爐ry {
  牋牋牋牋convertImage (parImage parWidth parHeight);
  牋牋牋牋writeBitmapFileHeader ();
  牋牋牋牋writeBitmapInfoHeader ();
  牋牋牋牋writeBitmap ();
  牋牋爙
  牋牋燾atch (Exception saveEx) {
  牋牋牋牋saveExprintStackTrace ();
  牋牋爙
  牋}
  
  牋/*
  牋? convertImage 將內存圖像轉換為位圖格式 (BRG)
  牋? 它還計算位圖信息標頭所用的某些信息
  牋?
  牋?/
  牋private boolean convertImage (Image parImage int parWidth int parHeight) {
  
  牋牋爄nt pad;
  牋牋燽itmap = new int [parWidth * parHeight];
  
  牋牋燩ixelGrabber pg = new PixelGrabber (parImage parWidth parHeight
  牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋燽itmap parWidth);
  
  牋牋爐ry {
  牋牋牋牋pggrabPixels ();
  牋牋爙
  牋牋燾atch (InterruptedException e) {
  牋牋牋牋eprintStackTrace ();
  牋牋牋牋return (false);
  牋牋爙
  
  牋牋爌ad = ( ((parWidth * ) % )) * parHeight;
  牋牋燽iSizeImage = ((parWidth * parHeight) * ) + pad;
  牋牋燽fSize = biSizeImage + BITMAPFILEHEADER_SIZE +
  BITMAPINFOHEADER_SIZE;
  牋牋燽iWidth = parWidth;
  牋牋燽iHeight = parHeight;
  
  牋牋爎eturn (true);
  牋}
  
  牋/*
  牋? writeBitmap 將象素捕獲器返回的圖像轉換為
  牋? 所需的格式請記住掃描行在位圖文件中是
  牋? 反向存儲的!
  牋?
  牋? 每個掃描行必須補足為 個字節
  牋?/
  牋private void writeBitmap () {
  
  牋牋牋int size;
  牋牋牋int value;
  牋牋牋int j;
  牋牋牋int i;
  牋牋牋int rowCount;
  牋牋牋int rowIndex;
  牋牋牋int lastRowIndex;

From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19219.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.