亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 用 java 保存位圖文件(轉(zhuǎn)).txt

?? 499篇java文章
?? TXT
字號:
作者:zergman
email: zergman@chinaasp.com
日期:2001-6-15 13:27:17
[b]用 Java 保存位圖文件
教程 -- 其中包括將圖像對象寫入位圖文件的全部代碼[/b]

[b]作者 Jean-Pierre Dubé[/b]
[BLOCKQUOTE][I][b]摘要[/b]
雖然 Java 提供了幾種打開圖像的機(jī)制,但保存圖像并不是它的強(qiáng)項(xiàng)。這篇技巧將講述如何將圖像保存在 24 位位圖文件中。另外,Jean-Pierre 還提供了將圖像文件寫入位圖文件所需的全部代碼。 [i][/i][/I][/BLOCKQUOTE]這篇技巧是 [url href=http://www.cn.ibm.com/developerWorks/java/jw-tips/tip043/index.shtml]Java 技巧 43[/url] 的補(bǔ)充,那篇技巧說明了在 Java 應(yīng)用程序中加載位圖文件的過程。本月我再提供一篇教程,說明如何將圖像保存在 24 位位圖文件中,其中還包含將圖像對象寫入位圖文件的代碼片斷。 
如果您在 Microsoft Windows 環(huán)境中工作,那么創(chuàng)建位圖文件的功能將為您提供許多方便。例如,在我的上一個(gè)項(xiàng)目中,我必須將 Java 與 Microsoft Access 對接。Java 程序允許用戶在屏幕上繪圖。這幅圖隨后被打印到 Microsoft Access 報(bào)表中。由于 Java 不支持 OLE,我的唯一選擇就是創(chuàng)建該圖的一個(gè)位圖文件,并通知 Microsoft Access 報(bào)表在何處能找到這個(gè)位圖文件。如果您寫過向剪貼板發(fā)送圖像的應(yīng)用程序,則這個(gè)技巧可能對您有用 -- 尤其是當(dāng)您將這個(gè)信息傳遞給另一個(gè)應(yīng)用程序時(shí)。 
[b]位圖文件的格式[/b]
位圖文件格式支持 4 位 RLE(行程長度編碼)以及 8 位和 24 位編碼。因?yàn)槲覀冎惶幚?24 位格式,所以下面我們查看一下該文件的結(jié)構(gòu)。 
位圖文件分為三個(gè)部分。我已將它們列在下面。 
[b]第 1 部分:位圖文件的標(biāo)頭[/b]
標(biāo)頭包含位圖文件的類型大小信息和版面信息。結(jié)構(gòu)如下(摘自 C 語言結(jié)構(gòu)定義): 
typedef struct tagBITMAPFILEHEADER {
   UINT bfType;
   DWORD bfSize;
   UINT bfReserved1;
   UINT bfReserved2;
   DWORD bfOffBits;
}BITMAPFILEHEADER;

下面是對這個(gè)清單中的代碼元素的說明: 
[UL][LI]bfType:指定文件類型,其值始終為 BM。 
[LI]bfSize:指定整個(gè)文件的大小(以字節(jié)為單位)。 
[LI]bfReserved1:保留 -- 必須為 0。 
[LI]bfReserved2:保留 -- 必須為 0。 
[LI]bfOffBits:指定從 BitmapFileHeader 到圖像首部的字節(jié)偏移量。 [/LI][/UL]
現(xiàn)在您已經(jīng)明白位圖標(biāo)頭的用途就是標(biāo)識位圖文件。讀取位圖文件的每個(gè)程序都使用位圖標(biāo)頭來進(jìn)行文件驗(yàn)證。 
[b]第 2 部分:位圖信息標(biāo)頭[/b]
隨后的標(biāo)頭稱為[i]信息標(biāo)頭[/i],其中包含圖像本身的屬性。 
下面說明如何指定 Windows 3.0(或更高版本)設(shè)備獨(dú)立位圖 (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;

以上代碼清單的每個(gè)元素說明如下: 
[UL][LI]biSize:指定 BITMAPINFOHEADER 結(jié)構(gòu)所需的字節(jié)數(shù)。 
[LI]biWidth:指定位圖的寬度(以象素為單位)。 
[LI]biHeight:指定位圖的高度(以象素為單位)。 
[LI]biPlanes:指定目標(biāo)設(shè)備的位面數(shù)。這個(gè)成員變量的值必須為 1。 
[LI]biBitCount:指定每個(gè)象素的位數(shù)。其值必須為 1、4、8 或 24。 
[LI]biCompression:指定壓縮位圖的壓縮類型。在 24 位格式中,該變量被設(shè)置為 0。 
[LI]biSizeImage:指定圖像的大小(以字節(jié)為單位)。如果位圖的格式是 BI_RGB,則將此成員變量設(shè)置為 0 是有效的。 
[LI]biXPelsPerMeter:為位圖指定目標(biāo)設(shè)備的水平分辨率(以“象素/米”為單位)。應(yīng)用程序可用該值從最符合當(dāng)前設(shè)備特征的資源群組中選擇一個(gè)位圖。 
[LI]biYPelsPerMeter:為位圖指定目標(biāo)設(shè)備的垂直分辨率(以“象素/米”為單位)。 
[LI]biClrUsed:指定位圖實(shí)際所用的顏色表中的顏色索引數(shù)。如果 biBitCount 設(shè)為 24,則 biClrUsed 指定用來優(yōu)化 Windows 調(diào)色板性能的參考顏色表。 
[LI]biClrImportant:指定對位圖的顯示有重要影響的顏色索引數(shù)。如果此值為 0,則所有顏色都很重要。 [/LI][/UL]
現(xiàn)在已定義了創(chuàng)建圖像所需的全部信息。 
[b]第 3 部分:圖像[/b]
在 24 位格式中,圖像中的每個(gè)象素都由存儲為 BRG 的三字節(jié) RGB 序列表示。每個(gè)掃描行都被補(bǔ)足到 4 位。為了使這個(gè)過程稍復(fù)雜一點(diǎn),圖像是自底而上存儲的,即第一個(gè)掃描行是圖像中的最后一個(gè)掃描行。下圖顯示了標(biāo)頭 (BITMAPHEADER) 和 (BITMAPINFOHEADER) 以及部分圖像。各個(gè)部分由垂線分隔: 
0000000000 4D42 B536 0002 0000 0000 0036 0000 | 0028
0000000020 0000 0107 0000 00E0 0000 0001 0018 0000
0000000040 0000 B500 0002 0EC4 0000 0EC4 0000 0000
0000000060 0000 0000 0000 | FFFF FFFF FFFF FFFF FFFF
0000000100 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
*

[b]現(xiàn)在,我們開始檢視代碼[/b]
現(xiàn)在我們已經(jīng)知道了 24 位位圖文件的結(jié)構(gòu),下面就是您期待已久的內(nèi)容:用來將圖像對象寫入位圖文件的代碼。 
import java.awt.*;
import java.io.*;
import java.awt.image.*;

public class BMPFile extends Component {

  //--- 私有常量
  private final static int BITMAPFILEHEADER_SIZE = 14;
  private final static int BITMAPINFOHEADER_SIZE = 40;

  //--- 私有變量聲明

  //--- 位圖文件標(biāo)頭
  private byte bitmapFileHeader [] = new byte [14];
  private byte bfType [] = {'B', 'M'};
  private int bfSize = 0;
  private int bfReserved1 = 0;
  private int bfReserved2 = 0;
  private int bfOffBits = BITMAPFILEHEADER_SIZE + BITMAPINFOHEADER_SIZE;

  //--- 位圖信息標(biāo)頭
  private byte bitmapInfoHeader [] = new byte [40];
  private int biSize = BITMAPINFOHEADER_SIZE;
  private int biWidth = 0;
  private int biHeight = 0;
  private int biPlanes = 1;
  private int biBitCount = 24;
  private int biCompression = 0;
  private int biSizeImage = 0x030000;
  private int biXPelsPerMeter = 0x0;
  private int biYPelsPerMeter = 0x0;
  private int biClrUsed = 0;
  private int biClrImportant = 0;

  //--- 位圖原始數(shù)據(jù)
  private int bitmap [];

  //--- 文件部分
  private FileOutputStream fo;

  //--- 缺省構(gòu)造函數(shù)
  public BMPFile() {

  }


  public void saveBitmap (String parFilename, Image parImage, int
parWidth, int parHeight) {

     try {
        fo = new FileOutputStream (parFilename);
        save (parImage, parWidth, parHeight);
        fo.close (); 
     }
     catch (Exception saveEx) {
        saveEx.printStackTrace ();
     }

  }


  /*
   * saveMethod 是該進(jìn)程的主方法。該方法
   * 將調(diào)用 convertImage 方法以將內(nèi)存圖像轉(zhuǎn)換為
   * 字節(jié)數(shù)組;writeBitmapFileHeader 方法創(chuàng)建并寫入
   * 位圖文件標(biāo)頭;writeBitmapInfoHeader 創(chuàng)建 
   * 信息標(biāo)頭;writeBitmap 寫入圖像。
   *
   */
  private void save (Image parImage, int parWidth, int parHeight) {

     try {
        convertImage (parImage, parWidth, parHeight);
        writeBitmapFileHeader ();
        writeBitmapInfoHeader ();
        writeBitmap ();
     }
     catch (Exception saveEx) {
        saveEx.printStackTrace ();
     }
  }


  /*
   * convertImage 將內(nèi)存圖像轉(zhuǎn)換為位圖格式 (BRG)。
   * 它還計(jì)算位圖信息標(biāo)頭所用的某些信息。
   *
   */
  private boolean convertImage (Image parImage, int parWidth, int parHeight) {

     int pad;
     bitmap = new int [parWidth * parHeight];

     PixelGrabber pg = new PixelGrabber (parImage, 0, 0, parWidth, parHeight,
                                         bitmap, 0, parWidth);

     try {
        pg.grabPixels ();
     }
     catch (InterruptedException e) {
        e.printStackTrace ();
        return (false);
     }

     pad = (4 - ((parWidth * 3) % 4)) * parHeight;
     biSizeImage = ((parWidth * parHeight) * 3) + pad;
     bfSize = biSizeImage + BITMAPFILEHEADER_SIZE +
BITMAPINFOHEADER_SIZE;
     biWidth = parWidth;
     biHeight = parHeight;

     return (true);
  }

  /*
   * writeBitmap 將象素捕獲器返回的圖像轉(zhuǎn)換為
   * 所需的格式。請記住:掃描行在位圖文件中是
   * 反向存儲的!
   *
   * 每個(gè)掃描行必須補(bǔ)足為 4 個(gè)字節(jié)。
   */
  private void writeBitmap () {

      int size;
      int value;
      int j;
      int i;
      int rowCount;
      int rowIndex;
      int lastRowIndex;
      int pad;
      int padCount;
      byte rgb [] = new byte [3];


      size = (biWidth * biHeight) - 1;
      pad = 4 - ((biWidth * 3) % 4);
      if (pad == 4) // <==== 錯(cuò)誤修正
         pad = 0; // <==== 錯(cuò)誤修正
      rowCount = 1;
      padCount = 0;
      rowIndex = size - biWidth;
      lastRowIndex = rowIndex;

      try {
         for (j = 0; j < size; j++) {
            value = bitmap [rowIndex];
            rgb [0] = (byte) (value & 0xFF);
            rgb [1] = (byte) ((value >> 8) & 0xFF);
            rgb [2] = (byte) ((value >> 16) & 0xFF);
            fo.write (rgb);
            if (rowCount == biWidth) {
               padCount += pad;
               for (i = 1; i <= pad; i++) {
                  fo.write (0x00);
               }
               rowCount = 1;
               rowIndex = lastRowIndex - biWidth;
               lastRowIndex = rowIndex;
            }
            else
               rowCount++;
            rowIndex++;
         }

         //--- 更新文件大小
         bfSize += padCount - pad;
         biSizeImage += padCount - pad;
      }
      catch (Exception wb) {
         wb.printStackTrace ();
      }

   } 

  /*
   * writeBitmapFileHeader 將位圖文件標(biāo)頭寫入文件中。
   *
   */
  private void writeBitmapFileHeader () {

     try {
        fo.write (bfType);
        fo.write (intToDWord (bfSize));
        fo.write (intToWord (bfReserved1));
        fo.write (intToWord (bfReserved2));
        fo.write (intToDWord (bfOffBits));

     }
     catch (Exception wbfh) {
        wbfh.printStackTrace ();
     }

  }

  /*
   *
   * writeBitmapInfoHeader 將位圖信息標(biāo)頭
   * 寫入文件中。
   *
   */

  private void writeBitmapInfoHeader () {

     try {
        fo.write (intToDWord (biSize));
        fo.write (intToDWord (biWidth));
        fo.write (intToDWord (biHeight));
        fo.write (intToWord (biPlanes));
        fo.write (intToWord (biBitCount));
        fo.write (intToDWord (biCompression));
        fo.write (intToDWord (biSizeImage));
        fo.write (intToDWord (biXPelsPerMeter));
        fo.write (intToDWord (biYPelsPerMeter));
        fo.write (intToDWord (biClrUsed));
        fo.write (intToDWord (biClrImportant));
     }
     catch (Exception wbih) {
        wbih.printStackTrace ();
     }

  }


  /*
   *
   * intToWord 將整數(shù)轉(zhuǎn)換為單字,返回值
   * 存儲在一個(gè)雙字節(jié)數(shù)組中。
   *
   */
  private byte [] intToWord (int parValue) {

     byte retValue [] = new byte [2];

     retValue [0] = (byte) (parValue & 0x00FF);
     retValue [1] = (byte) ((parValue >> 8) & 0x00FF);

     return (retValue);

  }

  /*
   *
   * intToDWord 將整數(shù)轉(zhuǎn)換為雙字,返回值
   * 存儲在一個(gè) 4 字節(jié)數(shù)組中。
   *
   */
  private byte [] intToDWord (int parValue) {

     byte retValue [] = new byte [4];

     retValue [0] = (byte) (parValue & 0x00FF);
     retValue [1] = (byte) ((parValue >> 8) & 0x000000FF);
     retValue [2] = (byte) ((parValue >> 16) & 0x000000FF);
     retValue [3] = (byte) ((parValue >> 24) & 0x000000FF);

     return (retValue);

  }

}

[b]小結(jié)[/b]
這就是所要做的全部工作。我確信您將會發(fā)現(xiàn)這個(gè)類很有用,因?yàn)榈?JDK 1.1.6 為止,Java 不支持用任何常用的格式保存圖像。JDK 1.2 將支持創(chuàng)建 JPEG 圖像,但不支持創(chuàng)建位圖。所以這個(gè)類仍將填補(bǔ) JDK1.2 中的空白。 
如果您使用這個(gè)類并發(fā)現(xiàn)了改進(jìn)它的方法,請通知我!下面的個(gè)人簡歷中有我的電子郵件地址。 
[TABLE][TR][TD][b]作者簡介[/b]
jeanpierre.dube Jean-Pierre Dubé 是一名自由 Java 咨詢者。他于 1988 年注冊創(chuàng)辦了 Infocom公司。從那時(shí)起,Infocom 已承接并開發(fā)了幾套應(yīng)用程序,涉及的領(lǐng)域包括制造業(yè)、文檔管理和大規(guī)模輸電線管理。他有豐富的 C 語言、Visual Basic 和 Java(最近)編程經(jīng)驗(yàn),他的公司現(xiàn)在主要使用 Java 語言。 Infocom 最近的一個(gè)項(xiàng)目是一種圖形 API,其測試版很快就會面市。 [/TD][/TR][/TABLE]

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91无套直看片红桃| 国产成人综合在线播放| 日韩一区二区电影在线| 成人免费视频网站在线观看| 夜夜精品浪潮av一区二区三区 | 欧洲生活片亚洲生活在线观看| 男人的天堂亚洲一区| 亚洲精品久久久蜜桃| 久久精品视频一区| 欧美精品视频www在线观看| 成人a区在线观看| 精品亚洲porn| 香蕉久久夜色精品国产使用方法 | 午夜欧美在线一二页| 国产精品久久久久毛片软件| 精品少妇一区二区三区免费观看 | 欧美国产视频在线| 欧美tickling网站挠脚心| 欧美日韩国产高清一区二区三区 | 综合自拍亚洲综合图不卡区| 久久久久久久久免费| 制服.丝袜.亚洲.中文.综合| 欧美最猛性xxxxx直播| 91麻豆精品在线观看| 成人激情图片网| 国产精品中文字幕日韩精品| 久久国内精品自在自线400部| 亚洲一线二线三线视频| 久久九九全国免费| 精品1区2区在线观看| 欧美mv和日韩mv的网站| 日韩一二三四区| 欧美一级日韩免费不卡| 欧美精品久久99| 欧美美女激情18p| 欧美日韩精品一区视频| 欧美日韩中文精品| 欧美日韩免费视频| 欧美日韩视频在线观看一区二区三区 | 国产一本一道久久香蕉| 国产自产高清不卡| 国产美女娇喘av呻吟久久| 国产在线看一区| 国产成人免费视频网站| 成人精品在线视频观看| 91在线观看下载| 91蜜桃免费观看视频| 色噜噜狠狠成人中文综合| 色综合中文综合网| 不卡免费追剧大全电视剧网站| 成人99免费视频| 色婷婷久久一区二区三区麻豆| 91国产视频在线观看| 欧美色电影在线| 6080亚洲精品一区二区| 欧美电视剧在线观看完整版| 久久精子c满五个校花| 国产精品第一页第二页第三页| 国产精品丝袜91| 一区二区三区毛片| 日韩成人午夜电影| 国产精品自拍一区| 91美女福利视频| 欧美丰满嫩嫩电影| 欧美精品一区二区三区蜜臀| 国产精品久久久久久久久图文区| 亚洲精品ww久久久久久p站| 五月天丁香久久| 国产精品一区二区91| 欧美亚洲动漫另类| 7777女厕盗摄久久久| 精品国产露脸精彩对白| 亚洲欧美日韩久久| 日韩av在线发布| 成+人+亚洲+综合天堂| 欧美老年两性高潮| 国产拍揄自揄精品视频麻豆| 亚洲一区二区在线观看视频 | 国产一区二区三区综合| 色综合久久精品| 精品美女被调教视频大全网站| 国产精品久久久久影院老司| 午夜精品视频在线观看| 国产大片一区二区| 精品视频1区2区| 中文字幕欧美区| 日日嗨av一区二区三区四区| 成人在线综合网| 欧美一级爆毛片| 中文字幕一区二区三区在线不卡| 五月天一区二区| caoporn国产精品| 日韩精品一区二区三区视频播放 | 欧美日韩一区不卡| 欧美国产精品中文字幕| 免费在线观看一区| aaa亚洲精品| 2020国产精品自拍| 午夜视频一区在线观看| 91在线精品秘密一区二区| 久久影院视频免费| 婷婷久久综合九色国产成人| 91丨porny丨国产| 久久久亚洲精品石原莉奈| 午夜精品福利在线| 在线亚洲高清视频| 国产精品久久久久久久久果冻传媒 | 中文字幕av一区二区三区高| 毛片av一区二区| 欧美日韩中文字幕一区二区| 中文字幕在线不卡| 国产成人在线视频免费播放| 欧美一区二区三区在线观看| 亚洲狠狠爱一区二区三区| 99精品热视频| 国产精品丝袜一区| 国产98色在线|日韩| 精品久久久久久久久久久久久久久久久 | 亚洲美女在线一区| 成人av网站免费观看| 国产婷婷精品av在线| 麻豆成人免费电影| 欧美丰满少妇xxxxx高潮对白| 亚洲香蕉伊在人在线观| 91老师国产黑色丝袜在线| 亚洲国产精华液网站w| 国产精品一级黄| 久久九九全国免费| 国产福利91精品一区| 久久久久国产精品免费免费搜索| 极品少妇xxxx精品少妇偷拍 | 一区二区三区国产精品| 国产二区国产一区在线观看| 久久久久久免费| 国产一区二区精品在线观看| 精品不卡在线视频| 国产一区在线不卡| 欧美激情在线一区二区三区| 国产iv一区二区三区| 日本一区二区综合亚洲| 成人av资源在线观看| 亚洲特黄一级片| 欧美在线free| 亚洲国产成人高清精品| 91精品国产综合久久福利 | 91丨九色丨蝌蚪富婆spa| 亚洲伦理在线免费看| 欧美性大战久久久| 日韩中文字幕一区二区三区| 欧美一区二区三区视频在线观看| 免费久久精品视频| 久久亚洲精品小早川怜子| 国产麻豆精品95视频| 国产精品丝袜在线| 欧美中文字幕一二三区视频| 人人爽香蕉精品| 久久综合九色综合97婷婷女人| 成人性生交大合| 一区二区三区免费网站| 91精品国产高清一区二区三区| 激情久久五月天| 亚洲欧美怡红院| 欧美精选午夜久久久乱码6080| 久久国产麻豆精品| 国产精品久久久久四虎| 欧美日韩精品一区二区天天拍小说 | 久久青草欧美一区二区三区| 成人黄动漫网站免费app| 一区二区三区四区乱视频| 91 com成人网| 高清在线成人网| 亚洲高清久久久| 久久婷婷久久一区二区三区| 色综合久久天天| 精品一区二区免费| 亚洲日本一区二区| 欧美一区二区三区小说| 99久久婷婷国产综合精品电影| 日韩成人dvd| 欧美国产综合一区二区| 欧美日韩国产影片| 国产精品资源在线看| 亚洲成人自拍网| 中文在线一区二区| 欧美日韩精品欧美日韩精品| 国产99精品国产| 日韩av一级片| 亚洲欧美成人一区二区三区| 欧美mv日韩mv国产网站app| 色域天天综合网| 国产精品乡下勾搭老头1| 亚洲va国产天堂va久久en| 国产精品卡一卡二卡三| 日韩一区二区在线看| 91国偷自产一区二区开放时间| 国产高清不卡一区二区| 美女视频第一区二区三区免费观看网站| 中文字幕中文在线不卡住| 欧美成人午夜电影| 欧美日韩精品一二三区|