溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java指南之使用圖形:使用圖像(轉(zhuǎn))

發(fā)布時間:2020-08-10 16:36:16 來源:ITPUB博客 閱讀:206 作者:rainytag 欄目:編程語言
使用圖像
這是一個圖像:



下面的幾頁將提供使用圖像所需要的詳細資料,你將學會如何加載、顯示和操縱它們。



--------------------------------------------------------------------------------
等等!: 雖然這節(jié)描述的API對JDK 1.1 和 Java 2 (JDK 1.2)都是有效的,但是我們還是推薦你使用Swing內(nèi)建的 icon 支持來代替。如果Swing的圖標不能滿足要求,而且你為Java 2寫程序,那么考慮使用Java 2D API,它在 2D 圖形 教材中有描述。
--------------------------------------------------------------------------------

圖像使用的支持分布于java.applet, java.awt, 和 java.awt.image 包中。每一個圖像都用一個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類或者實現(xiàn)ImageObserver接口中定義的imageUpdate方法跟蹤圖像的加載。
這一節(jié)也將告訴你如何輕松的使用MemoryImageSource類創(chuàng)建圖像。

顯示圖像
通過傳遞到paintComponent方法的Graphics對象可以很容易的顯示圖像。你簡單的在Graphics 對象上調(diào)用一個drawImage方法就可以。例如:
g.drawImage(myImage, 0, 0, this);

這一節(jié)解釋drawImage的四種形式,其中的兩種可以進行圖像的縮放。像getImage一樣,drawImage 也是異步的,即使圖像還沒有被全部加載或繪制也立即返回。

加載圖像
這一節(jié)描述如何得到一個圖像對應(yīng)的Image 對象。只要圖像數(shù)據(jù)在一個 GIF 或者 JPEG 格式文件里面而且你知道它的文件名或者URL,那么從它得到一個Image 就很簡單:只要使用Applet 或者 Toolkit 中的一個的getImage方法就就可以。getImage 方法立即返回,不檢查圖像數(shù)據(jù)是否存在。實際的圖像加載通常直到程序第一次繪制圖像時才進行。
對于很多程序,這個不可見的后臺加載工作工作得很好。否則需要跟蹤圖像的加載過程。這一節(jié)解釋如何使用MediaTracker 類和ImageObserver 接口達到目的。


--------------------------------------------------------------------------------
注意: ImageIcon 類自動使用一個MediaTracker 加載自己的圖像。
--------------------------------------------------------------------------------

最后,這節(jié)告訴你如何使用一個像MemoryImageSource這樣的類輕松的創(chuàng)建一個圖像。

使用getImage方法
這節(jié)首先討論Toolkit 的getImage方法,然后才是Applet 的getImage 方法。
Toolkit 明了兩個getImage 方法:

Image getImage(URL url)
Image getImage(String filename)
下面是使用Toolkit的getImage 方法的幾個例子。雖然每個Java程序和applet都可以使用這些方法, 但是 applets受通常的安全限制。特別的,不被信任的applets 不能成功的為getImage指定一個文件名,因為不被信任的applets不能從本機文件系統(tǒng)加載數(shù)據(jù)。你可以從 安全限制找到有關(guān)不被信任的applets的限制方面資料.

Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image1 = toolkit.getImage("imageFile.gif");
Image image2 = toolkit.getImage(
new URL("https://cache.yisu.com/upload/information/20200703/145/53375"));

Applet類提供兩個getImage 方法:


Image getImage(URL url)
Image getImage(URL url, String name)
只有applets 可以使用Applet 的getImage 方法。而且Applet 的getImage 方法只有在完整的背景(AppletContext)下才能工作。因為這個原因,這些方法在構(gòu)造方法或者在一個聲明一個實例變量的申明里面不能工作。你應(yīng)該從一個像init這樣的方法里面調(diào)用getImage。

下面的代碼范例演示了如何使用Applet 的code>getImage 方法。參考 使用AWT創(chuàng)建一個GUI 得到getCodeBase和getDocumentBase 方法的解釋。

//在Applet子類的一個方法里:
Image image1 = getImage(getCodeBase(), "imageFile.gif");
Image image2 = getImage(getDocumentBase(), "anImageFile.jpeg");
Image image3 = getImage(
new URL("https://cache.yisu.com/upload/information/20200703/145/53375"));

請求和跟蹤圖像加載: MediaTracker 和 ImageObserver
你可以以兩種方法跟蹤圖像加載: MediaTracker 類和 ImageObserver 接口。 MediaTracker 類對于很多程序是足夠的。你僅僅需要創(chuàng)建一個MediaTracker 實例,告訴它跟蹤一個或者多個圖像,然后如果需要的話向MediaTracker 查詢那些圖像的狀態(tài)。在 提高圖像動畫的外觀和性能里面有一個范例的解釋。
動畫范例展示了MediaTracker的兩個特別有用的特性:請求一組圖像數(shù)據(jù)的加載并且等待它們完成加載。請求一組圖像數(shù)據(jù)加載可以使用checkID和checkAll 的帶一個布爾參數(shù)的形式。將參數(shù)設(shè)置為 true可以開始加載任何還未被加載的圖像。或者你可以請求加載圖像然后使用waitForID和waitForAll方法等待。

ImageObserver 接口可以運行你進行比MediaTracker更緊密的跟蹤。 Component 類使用它,因此組件在它們要顯示的圖像被加載后進行重新繪制。為了使用 ImageObserver 接口,你需要實現(xiàn)ImageObserver的 imageUpdate 方法并且確保實現(xiàn)的對象被注冊為一個圖像觀察器。通常,這個注冊發(fā)生在你為drawImage方法指定一個ImageObserver,就像在稍后一節(jié)描述的那樣。 imageUpdate 方法在圖像的信息可見的任何時候被調(diào)用。

如果你瀏覽MediaTracker API 文檔,你可能會注意到 Component 類定義了兩個看上去有用的方法: checkImage 和 prepareImage。MediaTracker 類在很大程度上使得這些方法是不必要的。

用MemoryImageSource創(chuàng)建圖像
在像 MemoryImageSource 類這樣的圖像生產(chǎn)者的幫助下,你可以從你的幸手涂鴉上構(gòu)造圖像。下面的代碼范例打算創(chuàng)建一個100x100的圖像表示一個沿X軸的從黑到藍的漸變和沿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.drawImage(image, 0, 0, this);

下面的代碼在坐標(90, 0)處顯示一個被縮放為300象素寬62象素高的圖像:
g.drawImage(myImage, 90, 0, 300, 62, this);

下面的代碼片斷展示了一個applet加載一個圖像并且兩次顯示它,使用上面你看到的兩個片斷。你可以在 ImageDisplayer.java找到完整的的代碼。


這個圖片是該applet的GUI。要運行那個applet,單擊圖片。該applet將在一個新瀏覽窗口顯示。

Graphics 類聲明了下面的 drawImage 方法。它們都返回一個boolean值,雖然這個值很少被使用。如果圖像圖像已經(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
圖像左上角坐標。
int width, int height
圖像的寬度和高度(單位為象素)。
Color bgcolor
圖像下面的顏色。如果圖像包含透明象素時這會有用,圖像將在指定顏色背景下顯示。
ImageObserver observer
一個實現(xiàn)ImageObserver 接口的對象。它將該對象登記為一個圖像觀察者,因此當圖像的任何新信息可見時它被通知。大多組件可以簡單的指定this。
組件可以指定this作為圖像觀察者的原因是Component 類實現(xiàn)了ImageObserver 接口。當圖像數(shù)據(jù)被加載時它的實現(xiàn)調(diào)用repaint方法,這通常是你所期望的。
drawImage 方法只要要顯示的圖像數(shù)據(jù)已經(jīng)加載完就返回。如果你要確保drawImage只繪制完整的圖像,那么你需要跟蹤圖像的加載。參考 上一頁獲取跟蹤圖像加載的信息。[@more@]
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI