国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

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

2019-11-18 11:16:16
字體:
供稿:網(wǎng)友

  假如您在 Microsoft Windows 環(huán)境中工作,那么創(chuàng)建位圖文件的功能將為您提供許多方便。例如,在我的上一個項目中,我必須將 java 與 Microsoft access 對接。Java 程序答應(yīng)用戶在屏幕上繪圖。這幅圖隨后被打印到 Microsoft Access 報表中。由于 Java 不支持 OLE,我的唯一選擇就是創(chuàng)建該圖的一個位圖文件,并通知 Microsoft Access 報表在何處能找到這個位圖文件。假如您寫過向剪貼板發(fā)送圖像的應(yīng)用程序,則這個技巧可能對您有用 -- 尤其是當(dāng)您將這個信息傳遞給另一個應(yīng)用程序時。
  
  位圖文件的格式
  位圖文件格式支持 4 位 RLE(行程長度編碼)以及 8 位和 24 位編碼。因為我們只處理 24 位格式,所以下面我們查看一下該文件的結(jié)構(gòu)。
  
  位圖文件分為三個部分。我已將它們列在下面。
  
  第 1 部分:位圖文件的標(biāo)頭
  標(biāo)頭包含位圖文件的類型大小信息和版面信息。結(jié)構(gòu)如下(摘自 C 語言結(jié)構(gòu)定義):
  
  typedef strUCt tagBITMAPFILEHEADER {
  ??INT bfType;
  ??Word bfSize;
  ??INT bfReserved1;
  ??INT bfReserved2;
  ??WORD bfOffBits;
  }BITMAPFILEHEADER;
  
  
  下面是對這個清單中的代碼元素的說明:
  
  
  bfType:指定文件類型,其值始終為 BM。
  
  bfSize:指定整個文件的大小(以字節(jié)為單位)。
  
  bfReserved1:保留 -- 必須為 0。
  
  bfReserved2:保留 -- 必須為 0。
  
  bfOffBits:指定從 BitmapFileHeader 到圖像首部的字節(jié)偏移量。
  
  現(xiàn)在您已經(jīng)明白位圖標(biāo)頭的用途就是標(biāo)識位圖文件。讀取位圖文件的每個程序都使用位圖標(biāo)頭來進行文件驗證。
  
  第 2 部分:位圖信息標(biāo)頭
  隨后的標(biāo)頭稱為信息標(biāo)頭,其中包含圖像本身的屬性。
  
  下面說明如何指定 Windows 3.0(或更高版本)設(shè)備獨立位圖 (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 結(jié)構(gòu)所需的字節(jié)數(shù)。
  
  biWidth:指定位圖的寬度(以象素為單位)。
  
  biHeight:指定位圖的高度(以象素為單位)。
  
  biPlanes:指定目標(biāo)設(shè)備的位面數(shù)。這個成員變量的值必須為 1。
  
  biBitCount:指定每個象素的位數(shù)。 其值必須為 1、4、8 或 24。
  
  biCompression:指定壓縮位圖的壓縮類型。在 24 位格式中,該變量被設(shè)置為 0。
  
  biSizeImage:指定圖像的大小(以字節(jié)為單位)。假如位圖的格式是 BI_RGB,則將此成員變量設(shè)置為 0 是有效的。
  
  biXPelsPerMeter:為位圖指定目標(biāo)設(shè)備的水平分辨率(以“象素/米”為單位)。應(yīng)用程序可用該值從最符合當(dāng)前設(shè)備特征的資源群組中選擇一個位圖。
  
  biYPelsPerMeter:為位圖指定目標(biāo)設(shè)備的垂直分辨率(以“象素/米”為單位)。
  
  biClrUsed:指定位圖實際所用的顏色表中的顏色索引數(shù)。假如 biBitCount 設(shè)為 24,則 biClrUsed 指定用來優(yōu)化 Windows 調(diào)色板性能的參考顏色表。
  
  biClrImportant:指定對位圖的顯示有重要影響的顏色索引數(shù)。假如此值為 0,則所有顏色都很重要。
  
  現(xiàn)在已定義了創(chuàng)建圖像所需的全部信息。
  
  第 3 部分:圖像
  在 24 位格式中,圖像中的每個象素都由存儲為 BRG 的三字節(jié) RGB 序列表示。每個掃描行都被補足到 4 位。為了使這個過程稍復(fù)雜一點,圖像是自底而上存儲的,即第一個掃描行是圖像中的最后一個掃描行。下圖顯示了標(biāo)頭 (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
  *
  
  現(xiàn)在,我們開始檢視代碼
  現(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) {
  
  ???ry {
  ????fo = new FileOutputStream (parFilename);
  ????save (parImage, parWidth, parHeight);
  ????fo.close ();
  ???
  ???atch (Exception saveEx) {
  ????saveEx.printStackTrace ();
  ???
  
  ?}
  
  ?/*
  ?? saveMethod 是該進程的主方法。該方法
  ?? 將調(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) {
  
  ???ry {
  ????convertImage (parImage, parWidth, parHeight);
  ????writeBitmapFileHeader ();
  ????writeBitmapInfoHeader ();
  ????writeBitmap ();
  ???
  ???atch (Exception saveEx) {
  ????saveEx.printStackTrace ();
  ???
  ?}
  
  ?/*
  ?? convertImage 將內(nèi)存圖像轉(zhuǎn)換為位圖格式 (BRG)。
  ?? 它還計算位圖信息標(biāo)頭所用的某些信息。
  ??
  ??/
  ?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 將象素捕捉器返回的圖像轉(zhuǎn)換為
  ?? 所需的格式。請記住:掃描行在位圖文件中是
  ?? 反向存儲的!
  ??
  ?? 每個掃描行必須補足為 4 個字節(jié)。
  ??/
  ?private void writeBitmap () {
  
  ???int size;
  ???int value;
  ???int j;
  ???int i;
  ???int rowCount;
  ???int rowIndex;
  ???int lastRowIndex;

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 镶黄旗| 海淀区| 唐山市| 隆安县| 马鞍山市| 包头市| 桓仁| 山丹县| 上林县| 望谟县| 台东市| 萝北县| 汉川市| 蒙自县| 靖边县| 荔波县| 陵水| 兰考县| 南阳市| 凤凰县| 电白县| 永吉县| 瑞丽市| 南靖县| 石屏县| 武乡县| 沐川县| 楚雄市| 聂拉木县| 瓦房店市| 友谊县| 图片| 聂拉木县| 合水县| 辉南县| 吴川市| 仙居县| 张家川| 东辽县| 海盐县| 汉中市|