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

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

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

?? Java技術(shù)大合集,所有常用的技術(shù)在里面都有簡單例子
?? TXT
字號:
作者:五一
日期:2001-6-9 13:28:42
用 Java 保存位圖文件
5/23/2001 9:28:10· Jean-Pierre Dubé·jdeveloper

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

1 2  下一頁


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

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

  如果您在 Microsoft Windows 環(huán)境中工作,那么創(chuàng)建位圖文件的功能將為您提供許多方便。例如,在我的上一個項目中,我必須將 Java 與 Microsoft Access 對接。Java 程序允許用戶在屏幕上繪圖。這幅圖隨后被打印到 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 {
   UINT bfType;
   DWORD bfSize;
   UINT bfReserved1;
   UINT bfReserved2;
   DWORD bfOffBits;
  }BITMAPFILEHEADER; 

 下面是對這個清單中的代碼元素的說明: 

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

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

  bfReserved1:保留 -- 必須為 0。 

  bfReserved2:保留 -- 必須為 0。 

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

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

  第 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 序列表示。每個掃描行都被補(bǔ)足到 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)在我們已經(jīng)知道了 24 位位圖文件的結(jié)構(gòu),下面就是您期待已久的內(nèi)容:用來將圖像對象寫入位圖文件的代碼。 
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)。
* 它還計算位圖信息標(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)換為
* 所需的格式。請記住:掃描行在位圖文件中是
* 反向存儲的!
*
* 每個掃描行必須補(bǔ)足為 4 個字節(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) // <==== 錯誤修正
pad = 0; // <==== 錯誤修正
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)換為單字,返回值
* 存儲在一個雙字節(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)換為雙字,返回值
* 存儲在一個 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é)

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

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美三级电影在线观看| 国产精品亚洲一区二区三区妖精| 91麻豆精品国产91久久久久久久久 | 亚洲精品v日韩精品| 亚洲欧美日韩中文字幕一区二区三区 | 久久精品人人做人人爽97| 成人av网站免费| 日韩不卡免费视频| 亚洲婷婷综合久久一本伊一区 | 欧美一级视频精品观看| 91蜜桃婷婷狠狠久久综合9色| 蜜臀av性久久久久蜜臀aⅴ| 亚洲综合在线免费观看| 国产精品美日韩| 久久精品男人天堂av| 欧美大片一区二区| 欧美日韩成人激情| 亚洲黄色片在线观看| 欧美亚洲禁片免费| 91精品午夜视频| 色94色欧美sute亚洲线路二| 国产毛片一区二区| 裸体一区二区三区| 午夜av电影一区| 亚洲国产乱码最新视频| 亚洲欧美激情在线| 亚洲欧洲日韩综合一区二区| 国产天堂亚洲国产碰碰| 久久蜜桃av一区精品变态类天堂 | 国产精品一区专区| 毛片一区二区三区| 看电视剧不卡顿的网站| 青青青伊人色综合久久| 婷婷国产在线综合| 日韩高清一区在线| 免费观看一级欧美片| 日韩电影免费一区| 美腿丝袜亚洲一区| 91免费国产在线观看| 成人av电影免费在线播放| 国产v日产∨综合v精品视频| 国产精品一区免费视频| 狠狠色丁香久久婷婷综| 国产高清亚洲一区| 粉嫩13p一区二区三区| 成人精品小蝌蚪| aaa欧美日韩| 在线看不卡av| 制服视频三区第一页精品| 69堂精品视频| 久久午夜羞羞影院免费观看| 国产色91在线| 亚洲欧美一区二区三区国产精品| 亚洲愉拍自拍另类高清精品| 婷婷一区二区三区| 国内不卡的二区三区中文字幕| 老司机午夜精品| 国产成人av一区| 岛国av在线一区| 91国偷自产一区二区三区观看| 色呦呦网站一区| 欧美高清精品3d| 精品国产凹凸成av人网站| 久久久久一区二区三区四区| 亚洲色图在线播放| 亚洲成人自拍一区| 日韩av电影天堂| 国产精品亚洲专一区二区三区| 激情亚洲综合在线| 日本不卡一区二区三区| 天堂成人免费av电影一区| 日本午夜一本久久久综合| 激情另类小说区图片区视频区| 国产99久久久国产精品| 91香蕉视频黄| 日韩一卡二卡三卡| 国产精品久久一卡二卡| 午夜精品久久久久久久久久久| 久久精品国产秦先生| 国产大陆a不卡| 精品视频一区二区三区免费| 2021中文字幕一区亚洲| 亚洲欧美视频一区| 精久久久久久久久久久| 成人免费观看视频| 在线播放一区二区三区| 国产午夜亚洲精品理论片色戒| 亚洲天堂网中文字| 捆绑调教一区二区三区| 一本一本大道香蕉久在线精品 | 国产农村妇女精品| 午夜精品123| 成人一区二区三区在线观看| 欧美日韩大陆在线| 国产精品区一区二区三| 七七婷婷婷婷精品国产| 91女厕偷拍女厕偷拍高清| 精品久久久久久最新网址| 午夜日韩在线观看| 99久久99久久免费精品蜜臀| 欧美mv和日韩mv的网站| 亚洲高清不卡在线观看| 播五月开心婷婷综合| 久久亚区不卡日本| 日韩精品一区第一页| 99天天综合性| 国产亚洲精品7777| 麻豆专区一区二区三区四区五区| 色8久久人人97超碰香蕉987| 日本一区二区三区四区| 精品一区二区久久| 国产精品91xxx| 久久久久久久久一| 欧美日韩成人激情| 亚洲激情自拍视频| 不卡大黄网站免费看| 久久久一区二区| 麻豆精品精品国产自在97香蕉| 91高清视频在线| 亚洲欧美日韩国产手机在线| 国产激情视频一区二区在线观看 | 日韩一区二区麻豆国产| 亚洲自拍偷拍麻豆| 一本到不卡免费一区二区| 国产精品污网站| 成人污视频在线观看| 久久久午夜精品理论片中文字幕| 精品一区二区三区视频在线观看 | 亚洲国产电影在线观看| 国产精品一级二级三级| 精品国产亚洲在线| 精久久久久久久久久久| 精品国产乱子伦一区| 久久99这里只有精品| 欧美视频一区二区| 成人av影院在线| 成人午夜激情影院| 欧美人狂配大交3d怪物一区| 樱桃国产成人精品视频| 91国偷自产一区二区使用方法| 亚洲另类春色校园小说| 日本乱人伦一区| 亚洲一二三四区不卡| 精品视频免费在线| 日韩高清在线电影| 精品粉嫩超白一线天av| 国产成人精品免费在线| 中文字幕一区二| 一本色道久久综合狠狠躁的推荐| 亚洲免费伊人电影| 欧美体内she精高潮| 日韩精品欧美精品| 久久综合狠狠综合久久综合88| 国产一二三精品| 成人欧美一区二区三区视频网页 | 久久精品视频在线看| 丁香六月综合激情| 亚洲综合激情另类小说区| 在线播放中文字幕一区| 国产精品综合av一区二区国产馆| 亚洲欧洲精品成人久久奇米网| 色国产精品一区在线观看| 日韩电影在线一区| 国产欧美日韩卡一| 日本高清不卡aⅴ免费网站| 日本伊人精品一区二区三区观看方式| 日韩欧美国产1| 99re热视频这里只精品| 亚洲电影一级黄| 久久伊人中文字幕| 色偷偷久久一区二区三区| 日本在线不卡视频| 中文字幕巨乱亚洲| 51精品秘密在线观看| 懂色av噜噜一区二区三区av| 一区二区三区丝袜| 欧美videos中文字幕| 色天天综合色天天久久| 美日韩一区二区三区| 1024精品合集| 日韩欧美电影在线| 色综合久久综合网欧美综合网| 老司机精品视频导航| 有码一区二区三区| 久久精品视频在线免费观看 | 国产精品视频麻豆| 欧美一区二区三区四区久久 | zzijzzij亚洲日本少妇熟睡| 天堂va蜜桃一区二区三区 | 亚洲成a人片综合在线| 国产午夜亚洲精品不卡| 欧美人xxxx| 色狠狠综合天天综合综合| 国产一区二区三区在线看麻豆| 亚洲主播在线播放| 国产女人aaa级久久久级| 91精品国产免费| 91国产成人在线| 不卡视频免费播放| 激情综合色播激情啊|