亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 13:15:16
字體:
來源:轉載
供稿:網友

  假如您在 Microsoft Windows 環境中工作,那么創建位圖文件的功能將為您提供許多方便。例如,在我的上一個項目中,我必須將 java 與 Microsoft access 對接。Java 程序答應用戶在屏幕上繪圖。這幅圖隨后被打印到 Microsoft Access 報表中。由于 Java 不支持 OLE,我的唯一選擇就是創建該圖的一個位圖文件,并通知 Microsoft Access 報表在何處能找到這個位圖文件。假如您寫過向剪貼板發送圖像的應用程序,則這個技巧可能對您有用 -- 尤其是當您將這個信息傳遞給另一個應用程序時。
  
  位圖文件的格式
  位圖文件格式支持 4 位 RLE(行程長度編碼)以及 8 位和 24 位編碼。因為我們只處理 24 位格式,所以下面我們查看一下該文件的結構。
  
  位圖文件分為三個部分。我已將它們列在下面。
  
  第 1 部分:位圖文件的標頭
  標頭包含位圖文件的類型大小信息和版面信息。結構如下(摘自 C 語言結構定義):
  
  typedef strUCt tagBITMAPFILEHEADER {
  牋燯INT bfType;
  牋燚Word bfSize;
  牋燯INT bfReserved1;
  牋燯INT bfReserved2;
  牋燚WORD 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) 以及部分圖像。各個部分由垂線分隔:
  
  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
  *
  
  現在,我們開始檢視代碼
  現在我們已經知道了 24 位位圖文件的結構,下面就是您期待已久的內容:用來將圖像對象寫入位圖文件的代碼。
  
  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;
  
  牋//--- 私有變量聲明
  
  牋//--- 位圖文件標頭
  牋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;
  
  牋//--- 位圖信息標頭
  牋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;
  
  牋//--- 位圖原始數據
  牋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);
  牋牋牋牋fo.close ();
  牋牋爙
  牋牋燾atch (Exception saveEx) {
  牋牋牋牋saveEx.printStackTrace ();
  牋牋爙
  
  牋}
  
  牋/*
  牋? 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) {
  牋牋牋牋saveEx.printStackTrace ();
  牋牋爙
  牋}
  
  牋/*
  牋? convertImage 將內存圖像轉換為位圖格式 (BRG)。
  牋? 它還計算位圖信息標頭所用的某些信息。
  牋?
  牋?/
  牋private boolean convertImage (Image parImage, int parWidth, int parHeight) {
  
  牋牋爄nt pad;
  牋牋燽itmap = new int [parWidth * parHeight];
  
  牋牋燩ixelGrabber pg = new PixelGrabber (parImage, 0, 0, parWidth, parHeight,
  牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋燽itmap, 0, parWidth);
  
  牋牋爐ry {
  牋牋牋牋pg.grabPixels ();
  牋牋爙
  牋牋燾atch (InterruptedException e) {
  牋牋牋牋e.printStackTrace ();
  牋牋牋牋return (false);
  牋牋爙
  
  牋牋爌ad = (4 - ((parWidth * 3) % 4)) * parHeight;
  牋牋燽iSizeImage = ((parWidth * parHeight) * 3) + pad;
  牋牋燽fSize = biSizeImage + BITMAPFILEHEADER_SIZE +
  BITMAPINFOHEADER_SIZE;
  牋牋燽iWidth = parWidth;
  牋牋燽iHeight = parHeight;
  
  牋牋爎eturn (true);
  牋}
  
  牋/*
  牋? writeBitmap 將象素捕捉器返回的圖像轉換為
  牋? 所需的格式。請記住:掃描行在位圖文件中是
  牋? 反向存儲的!
  牋?
  牋? 每個掃描行必須補足為 4 個字節。
  牋?/
  牋private void writeBitmap () {
  
  牋牋牋int size;
  牋牋牋int value;
  牋牋牋int j;
  牋牋牋int i;
  牋牋牋int rowCount;
  牋牋牋int rowIndex;
  牋牋牋int lastRowIndex;

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩在线高清直播| 国产精品国语对白| 欧美多人爱爱视频网站| 91精品国产91久久久久久最新| 成人女保姆的销魂服务| 亚洲精品第一页| 日韩精品亚洲视频| 91久久中文字幕| 国产午夜精品视频免费不卡69堂| 曰本色欧美视频在线| 久热精品视频在线观看一区| 亚洲精品久久久久中文字幕欢迎你| 久热精品视频在线观看| 亚洲精品国产福利| 日韩精品免费看| 国产精品亚洲精品| 亚洲欧美国产精品va在线观看| 国产精品久久激情| 91九色在线视频| 国产精品黄色影片导航在线观看| 欧美激情精品久久久久久| 亚洲精品电影在线观看| 欧美亚洲在线视频| 国产视频精品在线| 欧美福利视频在线| 成人免费在线视频网站| 欧美裸体男粗大视频在线观看| 日韩中文字幕在线免费观看| 日韩精品久久久久久久玫瑰园| 成人一区二区电影| 在线观看精品自拍私拍| 2021国产精品视频| www高清在线视频日韩欧美| 亚洲自拍偷拍一区| 欧美精品一二区| 久久成人av网站| 26uuu另类亚洲欧美日本一| 国产日韩精品电影| 国产精品爽爽爽爽爽爽在线观看| 国内成人精品一区| 亚洲天堂av图片| 日韩av日韩在线观看| 海角国产乱辈乱精品视频| 亚洲精品一区二区网址| 欧美极品少妇与黑人| 久久精品国产91精品亚洲| 亚洲欧美日韩一区二区三区在线| 久久久91精品国产一区不卡| 亚洲欧美另类在线观看| 欧美另类69精品久久久久9999| 久久亚洲成人精品| 欧美精品久久久久| 欧美日韩另类在线| 欧美自拍视频在线| 国产精品久久久久久久9999| 国产美女精彩久久| 美日韩精品免费观看视频| 国产精品扒开腿做爽爽爽视频| 91精品中国老女人| 亚洲视屏在线播放| 久久久久久久av| 国产精品欧美日韩久久| 亚洲视频在线观看| 亚洲一区二区久久| 国产精品白丝av嫩草影院| 日韩精品中文字幕视频在线| 性色av一区二区三区| 久久人人爽人人爽爽久久| 亚洲精品720p| 国产欧美日韩专区发布| 久久精品中文字幕| 久久久在线免费观看| 91网在线免费观看| 国产极品精品在线观看| 久久久伊人日本| 国产婷婷97碰碰久久人人蜜臀| 亚洲国产精品久久久久| 韩国三级日本三级少妇99| 欧美激情videoshd| 91av在线精品| 亚洲欧美国产另类| 91麻豆国产精品| 国产九九精品视频| 亚洲第一色在线| 欧美中文在线观看国产| 久久久久国产视频| 18性欧美xxxⅹ性满足| 性视频1819p久久| 成人免费高清完整版在线观看| 97在线免费观看| 亚洲精品免费av| 最好看的2019的中文字幕视频| 免费不卡在线观看av| 久久不射热爱视频精品| 中文字幕精品视频| 国产成人精品999| 91影院在线免费观看视频| 欧美最顶级的aⅴ艳星| 九九九热精品免费视频观看网站| 日韩亚洲精品视频| 欧美在线不卡区| 亚洲欧美国产精品va在线观看| 青青草成人在线| 久久久久成人网| 91在线观看免费高清完整版在线观看| 日韩大片在线观看视频| 欧美另类极品videosbestfree| 色婷婷av一区二区三区在线观看| 日韩电影大全免费观看2023年上| 亚洲综合视频1区| 亚洲欧美国产精品专区久久| 久久久综合av| 亚洲精品视频中文字幕| 亚洲大胆人体在线| 97视频在线观看视频免费视频| 国产精品成人久久久久| 久久久亚洲成人| 久久亚洲一区二区三区四区五区高| 91成人国产在线观看| 国产精品日日摸夜夜添夜夜av| 国产精品丝袜一区二区三区| 国产成人av在线| 欧美精品免费播放| 亚洲福利视频专区| 日韩精品免费在线视频| 久久伊人精品一区二区三区| 一级做a爰片久久毛片美女图片| 久久手机精品视频| 欧美午夜精品久久久久久浪潮| 欧美日韩黄色大片| 国产欧美精品一区二区三区介绍| 亚洲色图35p| 欧美大人香蕉在线| 懂色aⅴ精品一区二区三区蜜月| 日韩中文字幕免费视频| 亚洲白拍色综合图区| 成人免费高清完整版在线观看| 国产精品久久久久av免费| 国内偷自视频区视频综合| 国产香蕉精品视频一区二区三区| 久久久97精品| 久久亚洲国产成人| 国产成人一区二区三区电影| 成人伊人精品色xxxx视频| 久久琪琪电影院| 日韩电影免费在线观看| 亚洲专区国产精品| 日韩av观看网址| 亚洲色图25p| 久久亚洲一区二区三区四区五区高| 国产91在线播放精品91| 色偷偷av一区二区三区| 亚洲欧美国产视频| 九九热视频这里只有精品| 久久久久久久电影一区| 俺去亚洲欧洲欧美日韩| 午夜欧美大片免费观看| 亚洲精品一区二区在线| 久久人91精品久久久久久不卡| 国产精品伦子伦免费视频| 色综合伊人色综合网| 国产精品va在线播放我和闺蜜| 日韩精品亚洲视频| 欧美日韩美女视频|