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

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

?? 用 java 保存位圖文件.txt

?? 考取JAVA證件的資料
?? TXT
字號(hào):
作者:五一
日期:2001-6-9 13:28:42
用 Java 保存位圖文件
5/23/2001 9:28:10· Jean-Pierre Dubé·jdeveloper

--------------------------------------------------------------------------------

1 2  下一頁


摘要 
  雖然 Java 提供了幾種打開圖像的機(jī)制,但保存圖像并不是它的強(qiáng)項(xiàng)。這篇技巧將講述如何將圖像保存在 24 位位圖文件中。另外,Jean-Pierre 還提供了將圖像文件寫入位圖文件所需的全部代碼。 

  這篇技巧是 "在 Java 應(yīng)用程序中加載位圖文件的逐步指南" 的補(bǔ)充,那篇技巧說明了在 Java 應(yīng)用程序中加載位圖文件的過程。本月我再提供一篇教程,說明如何將圖像保存在 24 位位圖文件中,其中還包含將圖像對(duì)象寫入位圖文件的代碼片斷。 

  如果您在 Microsoft Windows 環(huán)境中工作,那么創(chuàng)建位圖文件的功能將為您提供許多方便。例如,在我的上一個(gè)項(xiàng)目中,我必須將 Java 與 Microsoft Access 對(duì)接。Java 程序允許用戶在屏幕上繪圖。這幅圖隨后被打印到 Microsoft Access 報(bào)表中。由于 Java 不支持 OLE,我的唯一選擇就是創(chuàng)建該圖的一個(gè)位圖文件,并通知 Microsoft Access 報(bào)表在何處能找到這個(gè)位圖文件。如果您寫過向剪貼板發(fā)送圖像的應(yīng)用程序,則這個(gè)技巧可能對(duì)您有用 -- 尤其是當(dāng)您將這個(gè)信息傳遞給另一個(gè)應(yīng)用程序時(shí)。 

  位圖文件的格式

  位圖文件格式支持 4 位 RLE(行程長(zhǎng)度編碼)以及 8 位和 24 位編碼。因?yàn)槲覀冎惶幚?24 位格式,所以下面我們查看一下該文件的結(jié)構(gòu)。 

  位圖文件分為三個(gè)部分。我已將它們列在下面。 

  第 1 部分:位圖文件的標(biāo)頭

  標(biāo)頭包含位圖文件的類型大小信息和版面信息。結(jié)構(gòu)如下(摘自 C 語言結(jié)構(gòu)定義): 

 
typedef struct tagBITMAPFILEHEADER {
   UINT bfType;
   DWORD bfSize;
   UINT bfReserved1;
   UINT bfReserved2;
   DWORD bfOffBits;
  }BITMAPFILEHEADER; 

 下面是對(duì)這個(gè)清單中的代碼元素的說明: 

  bfType:指定文件類型,其值始終為 BM。 

  bfSize:指定整個(gè)文件的大小(以字節(jié)為單位)。 

  bfReserved1:保留 -- 必須為 0。 

  bfReserved2:保留 -- 必須為 0。 

  bfOffBits:指定從 BitmapFileHeader 到圖像首部的字節(jié)偏移量。 

  現(xiàn)在您已經(jīng)明白位圖標(biāo)頭的用途就是標(biāo)識(shí)位圖文件。讀取位圖文件的每個(gè)程序都使用位圖標(biāo)頭來進(jìn)行文件驗(yàn)證。 

  第 2 部分:位圖信息標(biāo)頭

  隨后的標(biāo)頭稱為信息標(biāo)頭,其中包含圖像本身的屬性。 

  下面說明如何指定 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è)元素說明如下: 


   biSize:指定 BITMAPINFOHEADER 結(jié)構(gòu)所需的字節(jié)數(shù)。 

   biWidth:指定位圖的寬度(以象素為單位)。 

   biHeight:指定位圖的高度(以象素為單位)。 

   biPlanes:指定目標(biāo)設(shè)備的位面數(shù)。這個(gè)成員變量的值必須為 1。 

   biBitCount:指定每個(gè)象素的位數(shù)。其值必須為 1、4、8 或 24。 

   biCompression:指定壓縮位圖的壓縮類型。在 24 位格式中,該變量被設(shè)置為 0。 

   biSizeImage:指定圖像的大小(以字節(jié)為單位)。如果位圖的格式是 BI_RGB,則將此成員變量設(shè)置為 0 是有效的。 

   biXPelsPerMeter:為位圖指定目標(biāo)設(shè)備的水平分辨率(以“象素/米”為單位)。應(yīng)用程序可用該值從最符合當(dāng)前設(shè)備特征的資源群組中選擇一個(gè)位圖。 

   biYPelsPerMeter:為位圖指定目標(biāo)設(shè)備的垂直分辨率(以“象素/米”為單位)。 

   biClrUsed:指定位圖實(shí)際所用的顏色表中的顏色索引數(shù)。如果 biBitCount 設(shè)為 24,則 biClrUsed 指定用來優(yōu)化 Windows 調(diào)色板性能的參考顏色表。 

   biClrImportant:指定對(duì)位圖的顯示有重要影響的顏色索引數(shù)。如果此值為 0,則所有顏色都很重要。 

  現(xiàn)在已定義了創(chuàng)建圖像所需的全部信息。 

  第 3 部分:圖像

  在 24 位格式中,圖像中的每個(gè)象素都由存儲(chǔ)為 BRG 的三字節(jié) RGB 序列表示。每個(gè)掃描行都被補(bǔ)足到 4 位。為了使這個(gè)過程稍復(fù)雜一點(diǎn),圖像是自底而上存儲(chǔ)的,即第一個(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
* 

在,我們開始檢視代碼

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

public class BMPFile extends Component {

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

file://--- 私有變量聲明

file://--- 位圖文件標(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;

file://--- 位圖信息標(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;

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

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

file://--- 缺省構(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)換為
* 所需的格式。請(qǐng)記住:掃描行在位圖文件中是
* 反向存儲(chǔ)的!
*
* 每個(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++;
}

file://--- 更新文件大小
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)換為單字,返回值
* 存儲(chǔ)在一個(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)換為雙字,返回值
* 存儲(chǔ)在一個(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);

}

}
 

  小結(jié)

  這就是所要做的全部工作。我確信您將會(huì)發(fā)現(xiàn)這個(gè)類很有用,因?yàn)榈?JDK 1.1.6 為止,Java 不支持用任何常用的格式保存圖像。JDK 1.2 將支持創(chuàng)建 JPEG 圖像,但不支持創(chuàng)建位圖。所以這個(gè)類仍將填補(bǔ) JDK1.2 中的空白。

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩免费视频一区二区| 欧美美女直播网站| 亚洲成人综合在线| 久久精品亚洲国产奇米99| 91小视频在线观看| 久久99精品久久久| 亚洲乱码国产乱码精品精小说| 日韩欧美色电影| 在线观看精品一区| 成人一道本在线| 蜜臀av一区二区在线免费观看| 亚洲色图欧洲色图婷婷| 久久久久综合网| 日韩欧美一区二区免费| 色婷婷精品久久二区二区蜜臂av| 国产一区二区三区黄视频| 午夜成人在线视频| 亚洲免费av高清| 中文字幕一区二区三中文字幕| 日韩欧美一级精品久久| 7777精品伊人久久久大香线蕉的| 93久久精品日日躁夜夜躁欧美| 精品制服美女久久| 免费成人av在线| 天天影视网天天综合色在线播放| 国产精品黄色在线观看| 久久久不卡网国产精品一区| 精品日韩欧美一区二区| 欧美网站大全在线观看| 91久久香蕉国产日韩欧美9色| 成人午夜视频免费看| 韩国三级在线一区| 久久爱另类一区二区小说| 日韩国产精品久久久| 亚洲制服欧美中文字幕中文字幕| 一区在线中文字幕| 中文字幕 久热精品 视频在线| 精品久久久三级丝袜| 欧美大片在线观看| 精品嫩草影院久久| 日韩一区二区三区精品视频| 欧美日韩高清影院| 欧美日韩一区高清| 69堂成人精品免费视频| 在线播放国产精品二区一二区四区| 欧美羞羞免费网站| 欧美日韩一区二区三区四区| 在线免费观看日本欧美| 欧美性猛交一区二区三区精品| 91麻豆精东视频| 欧美亚洲动漫制服丝袜| 6080日韩午夜伦伦午夜伦| 欧美一区二区三区四区五区| 亚洲免费在线观看视频| 亚洲精品日韩综合观看成人91| 一区二区三区精品| 亚洲成人777| 青娱乐精品在线视频| 精品伊人久久久久7777人| 激情综合网av| 不卡高清视频专区| 在线看一区二区| 91精品视频网| 久久只精品国产| 欧美激情一二三区| 亚洲你懂的在线视频| 亚洲亚洲人成综合网络| 轻轻草成人在线| 成人午夜私人影院| 欧洲精品视频在线观看| 在线综合+亚洲+欧美中文字幕| 日韩免费观看高清完整版在线观看| 久久尤物电影视频在线观看| 国产精品久久久久久久久久免费看| 曰韩精品一区二区| 美腿丝袜一区二区三区| 成人av动漫在线| 欧美日韩国产一区| 精品三级在线观看| 亚洲精品欧美二区三区中文字幕| 日韩成人精品在线| 成人精品小蝌蚪| 欧美亚洲日本一区| 久久精品人人爽人人爽| 亚洲精品国产精品乱码不99| 久久精品72免费观看| 99久久夜色精品国产网站| 欧美肥妇bbw| 国产精品久久久99| 日本不卡在线视频| www.色综合.com| 日韩欧美亚洲国产另类| 亚洲欧美精品午睡沙发| 开心九九激情九九欧美日韩精美视频电影| 欧美精品一区二区久久久| 中文字幕一区二区三区视频| 五月激情丁香一区二区三区| 国产成人精品在线看| 欧美电影一区二区| 亚洲三级免费电影| 韩国欧美一区二区| 欧美日韩精品一区视频| 国产精品久久影院| 极品少妇xxxx精品少妇| 91蜜桃在线观看| 国产三级精品三级| 日韩 欧美一区二区三区| 97精品电影院| 国产午夜一区二区三区| 免费成人在线观看| 欧美日韩一级大片网址| 中文字幕亚洲电影| 狠狠色丁香久久婷婷综| 欧美日韩精品一区二区三区四区| 欧美激情中文字幕一区二区| 美腿丝袜亚洲色图| 在线播放视频一区| 亚洲一区二区三区四区的| 成人h动漫精品一区二区| 2020国产精品| 麻豆成人免费电影| 欧美亚洲国产一区二区三区va| **性色生活片久久毛片| 国产91清纯白嫩初高中在线观看 | 激情综合色综合久久综合| 在线观看视频一区二区欧美日韩| 国产精品免费免费| 国产成人午夜精品影院观看视频 | 精品在线免费观看| 欧美电影免费提供在线观看| 日本免费在线视频不卡一不卡二| 欧美日韩国产一级二级| 亚洲一区二区三区四区不卡| 91九色最新地址| 一区二区三区中文字幕| 91麻豆国产福利在线观看| 国产精品色婷婷| 成人av影院在线| 中文字幕一区二区三区在线不卡 | 日产国产高清一区二区三区 | 国产精品久久久久aaaa樱花| 成人精品国产一区二区4080| 欧美韩国日本不卡| av一本久道久久综合久久鬼色| 亚洲欧洲韩国日本视频| 97久久精品人人做人人爽| 亚洲欧美日韩综合aⅴ视频| 99久免费精品视频在线观看| 1024精品合集| 日本韩国精品一区二区在线观看| 亚洲男人的天堂一区二区| 欧美性高清videossexo| 午夜成人免费视频| 精品国产乱码91久久久久久网站| 精品无码三级在线观看视频| 久久久久久99久久久精品网站| 成人免费电影视频| 亚洲欧美偷拍三级| 6080午夜不卡| 国产很黄免费观看久久| 国产精品久久久久aaaa樱花| 欧洲精品一区二区| 麻豆精品一区二区综合av| 久久久99久久| 色婷婷精品久久二区二区蜜臂av| 亚洲国产精品麻豆| 精品免费国产一区二区三区四区| 国产盗摄视频一区二区三区| 亚洲欧美另类久久久精品2019| 91.成人天堂一区| 国产精选一区二区三区| 亚洲人成在线播放网站岛国| 在线不卡免费av| 成人黄色免费短视频| 亚洲一区二区美女| 久久综合色鬼综合色| 99re这里只有精品首页| 天天影视涩香欲综合网| 久久久精品人体av艺术| 色天使久久综合网天天| 蜜臀精品一区二区三区在线观看| 国产精品热久久久久夜色精品三区 | av高清久久久| 日本aⅴ精品一区二区三区| 国产欧美日韩不卡| 欧美日本一区二区三区四区| 国产一区二区三区高清播放| 亚洲黄色免费网站| 久久精品一区蜜桃臀影院| 在线观看不卡视频| 国产精品夜夜嗨| 日日摸夜夜添夜夜添精品视频| 久久精品亚洲一区二区三区浴池 | 精品一二三四区| 亚洲精品欧美激情| 国产视频一区不卡| 91精品国产综合久久小美女| 色综合久久久久网| 国产精品一区二区视频| 三级久久三级久久|