java指南之使用圖形:使用圖像(轉(zhuǎn))-創(chuàng)新互聯(lián)

使用圖像
這是一個(gè)圖像:
下面的幾頁將提供使用圖像所需要的詳細(xì)資料,你將學(xué)會如何加載、顯示和操縱它們。
--------------------------------------------------------------------------------
等等!: 雖然這節(jié)描述的API對JDK 1.1 和 Java 2 (JDK 1.2)都是有效的,但是我們還是推薦你使用Swing內(nèi)建的 icon 支持來代替。如果Swing的圖標(biāo)不能滿足要求,而且你為Java 2寫程序,那么考慮使用Java 2D API,它在 2D 圖形 教材中有描述。
--------------------------------------------------------------------------------
圖像使用的支持分布于java.applet, java.awt, 和 java.awt.image 包中。每一個(gè)圖像都用一個(gè)java.awt.Image 對象表示。除了Image 類外,java.awt 包提供了其它的基本的圖像支持,例如Graphics 類的drawImage 方法,Toolkit 對象的getImage 方法以及MediaTracker 類。在java.applet包中,Applet 類的getImage 方法使得可以很容易的使用URL加載圖像。最后,java.awt.image包提供可用于創(chuàng)建、操縱和觀察圖像的接口和類。
加載圖像
AWT可以很簡單的加載兩種格式的圖像: GIF 和 JPEG。Applet和Toolkit 類提供了getImage 方法可以使用那兩種格式。像這樣使用:
myImage = getImage(URL); //只能在Applet 子類里
或者
myImage = Toolkit.getDefaultToolkit().getImage(filenameOrURL);
getImage 立即返回,因此你不必等待圖像加載完而可以直接在你的程序中執(zhí)行其它的操作。雖然這可以提高性能,但是有效程序需要更多的控制或者有關(guān)圖像的更多信息。你可以通過使用MediaTracker類或者實(shí)現(xiàn)ImageObserver接口中定義的imageUpdate方法跟蹤圖像的加載。
這一節(jié)也將告訴你如何輕松的使用MemoryImageSource類創(chuàng)建圖像。
顯示圖像
通過傳遞到paintComponent方法的Graphics對象可以很容易的顯示圖像。你簡單的在Graphics 對象上調(diào)用一個(gè)drawImage方法就可以。例如:
g.drawImage(myImage, 0, 0, this);
這一節(jié)解釋drawImage的四種形式,其中的兩種可以進(jìn)行圖像的縮放。像getImage一樣,drawImage 也是異步的,即使圖像還沒有被全部加載或繪制也立即返回。
加載圖像
這一節(jié)描述如何得到一個(gè)圖像對應(yīng)的Image 對象。只要圖像數(shù)據(jù)在一個(gè) GIF 或者 JPEG 格式文件里面而且你知道它的文件名或者URL,那么從它得到一個(gè)Image 就很簡單:只要使用Applet 或者 Toolkit 中的一個(gè)的getImage方法就就可以。getImage 方法立即返回,不檢查圖像數(shù)據(jù)是否存在。實(shí)際的圖像加載通常直到程序第一次繪制圖像時(shí)才進(jìn)行。
對于很多程序,這個(gè)不可見的后臺加載工作工作得很好。否則需要跟蹤圖像的加載過程。這一節(jié)解釋如何使用MediaTracker 類和ImageObserver 接口達(dá)到目的。
--------------------------------------------------------------------------------
注意: ImageIcon 類自動使用一個(gè)MediaTracker 加載自己的圖像。
--------------------------------------------------------------------------------
最后,這節(jié)告訴你如何使用一個(gè)像MemoryImageSource這樣的類輕松的創(chuàng)建一個(gè)圖像。
使用getImage方法
這節(jié)首先討論Toolkit 的getImage方法,然后才是Applet 的getImage 方法。
Toolkit 明了兩個(gè)getImage 方法:
Image getImage(URL url)
Image getImage(String filename)
下面是使用Toolkit的getImage 方法的幾個(gè)例子。雖然每個(gè)Java程序和applet都可以使用這些方法, 但是 applets受通常的安全限制。特別的,不被信任的applets 不能成功的為getImage指定一個(gè)文件名,因?yàn)椴槐恍湃蔚腶pplets不能從本機(jī)文件系統(tǒng)加載數(shù)據(jù)。你可以從 安全限制找到有關(guān)不被信任的applets的限制方面資料.
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image1 = toolkit.getImage("imageFile.gif");
Image image2 = toolkit.getImage(
new URL("/tupian/20230522/404.html />
Applet類提供兩個(gè)getImage 方法:
Image getImage(URL url)
Image getImage(URL url, String name)
只有applets 可以使用Applet 的getImage 方法。而且Applet 的getImage 方法只有在完整的背景(AppletContext)下才能工作。因?yàn)檫@個(gè)原因,這些方法在構(gòu)造方法或者在一個(gè)聲明一個(gè)實(shí)例變量的申明里面不能工作。你應(yīng)該從一個(gè)像init這樣的方法里面調(diào)用getImage。
下面的代碼范例演示了如何使用Applet 的code>getImage 方法。參考 使用AWT創(chuàng)建一個(gè)GUI 得到getCodeBase和getDocumentBase 方法的解釋。
//在Applet子類的一個(gè)方法里:
Image image1 = getImage(getCodeBase(), "imageFile.gif");
Image image2 = getImage(getDocumentBase(), "anImageFile.jpeg");
Image image3 = getImage(
new URL("/tupian/20230522/404.html />
請求和跟蹤圖像加載: MediaTracker 和 ImageObserver
你可以以兩種方法跟蹤圖像加載: MediaTracker 類和 ImageObserver 接口。 MediaTracker 類對于很多程序是足夠的。你僅僅需要創(chuàng)建一個(gè)MediaTracker 實(shí)例,告訴它跟蹤一個(gè)或者多個(gè)圖像,然后如果需要的話向MediaTracker 查詢那些圖像的狀態(tài)。在 提高圖像動畫的外觀和性能里面有一個(gè)范例的解釋。
動畫范例展示了MediaTracker的兩個(gè)特別有用的特性:請求一組圖像數(shù)據(jù)的加載并且等待它們完成加載。請求一組圖像數(shù)據(jù)加載可以使用checkID和checkAll 的帶一個(gè)布爾參數(shù)的形式。將參數(shù)設(shè)置為 true可以開始加載任何還未被加載的圖像?;蛘吣憧梢哉埱蠹虞d圖像然后使用waitForID和waitForAll方法等待。
ImageObserver 接口可以運(yùn)行你進(jìn)行比MediaTracker更緊密的跟蹤。 Component 類使用它,因此組件在它們要顯示的圖像被加載后進(jìn)行重新繪制。為了使用 ImageObserver 接口,你需要實(shí)現(xiàn)ImageObserver的 imageUpdate 方法并且確保實(shí)現(xiàn)的對象被注冊為一個(gè)圖像觀察器。通常,這個(gè)注冊發(fā)生在你為drawImage方法指定一個(gè)ImageObserver,就像在稍后一節(jié)描述的那樣。 imageUpdate 方法在圖像的信息可見的任何時(shí)候被調(diào)用。
如果你瀏覽MediaTracker API 文檔,你可能會注意到 Component 類定義了兩個(gè)看上去有用的方法: checkImage 和 prepareImage。MediaTracker 類在很大程度上使得這些方法是不必要的。
用MemoryImageSource創(chuàng)建圖像
在像 MemoryImageSource 類這樣的圖像生產(chǎn)者的幫助下,你可以從你的幸手涂鴉上構(gòu)造圖像。下面的代碼范例打算創(chuàng)建一個(gè)100x100的圖像表示一個(gè)沿X軸的從黑到藍(lán)的漸變和沿Y軸的從黑到紅的漸變。
int w = 100;
int h = 100;
int[] pix = new int[w * h];
int index = 0;
for (int y = 0; y < h; y++) {
int red = (y * 255) / (h - 1);
for (int x = 0; x < w; x++) {
int blue = (x * 255) / (w - 1);
pix[index++] = (255 << 24) | (red << 16) | blue;
}
}
Image img = createImage(new MemoryImageSource(w, h, pix, 0, w));
顯示圖像
下面的代碼在組件區(qū)域的左上角(0, 0)以原始大小顯示一個(gè)圖像:
g.drawImage(image, 0, 0, this);
下面的代碼在坐標(biāo)(90, 0)處顯示一個(gè)被縮放為300象素寬62象素高的圖像:
g.drawImage(myImage, 90, 0, 300, 62, this);
下面的代碼片斷展示了一個(gè)applet加載一個(gè)圖像并且兩次顯示它,使用上面你看到的兩個(gè)片斷。你可以在 ImageDisplayer.java找到完整的的代碼。
這個(gè)圖片是該applet的GUI。要運(yùn)行那個(gè)applet,單擊圖片。該applet將在一個(gè)新瀏覽窗口顯示。
Graphics 類聲明了下面的 drawImage 方法。它們都返回一個(gè)boolean值,雖然這個(gè)值很少被使用。如果圖像圖像已經(jīng)被完全加載并且因此被完全繪制,返回值是true;否則,返回值是false。
boolean drawImage(Image img, int x, int y, ImageObserver observer)
boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer)
boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)
drawImage 方法有下面的參數(shù):
Image img
需要繪制的圖像。
int x, int y
圖像左上角坐標(biāo)。
int width, int height
圖像的寬度和高度(單位為象素)。
Color bgcolor
圖像下面的顏色。如果圖像包含透明象素時(shí)這會有用,圖像將在指定顏色背景下顯示。
ImageObserver observer
一個(gè)實(shí)現(xiàn)ImageObserver 接口的對象。它將該對象登記為一個(gè)圖像觀察者,因此當(dāng)圖像的任何新信息可見時(shí)它被通知。大多組件可以簡單的指定this。
組件可以指定this作為圖像觀察者的原因是Component 類實(shí)現(xiàn)了ImageObserver 接口。當(dāng)圖像數(shù)據(jù)被加載時(shí)它的實(shí)現(xiàn)調(diào)用repaint方法,這通常是你所期望的。
drawImage 方法只要要顯示的圖像數(shù)據(jù)已經(jīng)加載完就返回。如果你要確保drawImage只繪制完整的圖像,那么你需要跟蹤圖像的加載。參考 上一頁獲取跟蹤圖像加載的信息。[@more@]

分享名稱:java指南之使用圖形:使用圖像(轉(zhuǎn))-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://muchs.cn/article26/iohcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)外貿(mào)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、靜態(tài)網(wǎng)站、做網(wǎng)站、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司