java drawimage()方法

來源:互聯網
上載者:User

映像使用的支援分佈於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包提供可用於建立、操縱和觀察映像的
介面和類。

載入映像
AWT可以很簡單的載入兩種格式的映像: GIF 和 JPEG。Applet和Toolkit 類提供了getImage
方法可以使用那兩種格式。像這樣使用:
myImage = getImage(URL); //只能在Applet 子類裡
     或者

Java代碼
  1. myImage = Toolkit.getDefaultToolkit().getImage(filenameOrURL);  
myImage = Toolkit.getDefaultToolkit().getImage(filenameOrURL);

getImage
立即返回,因此你不必等待映像載入完而可以直接在你的程式中執行其它的操作。雖然這可以提高效能,但是有效程式需要更多的控制或者有關映像的更多資訊。你
可以通過使用MediaTracker類或者實現ImageObserver介面中定義的imageUpdate方法跟蹤映像的載入。
這一節也將告訴你如何輕鬆的使用MemoryImageSource類建立映像。

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

這一節解釋drawImage的四種形式,其中的兩種可以進行映像的縮放。像getImage一樣,drawImage
也是非同步,即使映像還沒有被全部載入或繪製也立即返回。

載入映像
這 一節描述如何得到一個映像對應的Image 對象。只要映像資料在一個
GIF 或者 JPEG 格式檔案裡面而且你知道它的檔案名稱或者URL,那麼從它 得到一個Image 就很簡單:只要使用Applet 或者 Toolkit
中的一個的getImage方法就就可以。getImage 方法立即返
回,不檢查映像資料是否存在。實際的映像載入通常直到程式第一次繪製映像時才進行。
對於很多程式,這個不可見的後台載入工作工作得很好。否則需要跟蹤映像的載入過程。這一節解釋如何使用MediaTracker
類和ImageObserver
介面達到目的。

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

最後,這節告訴你如何使用一個像MemoryImageSource這樣的類輕鬆的建立一個映像。

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

Java代碼
  1. Image getImage(URL url)    
  2. Image getImage(String filename)   
Image getImage(URL url) Image getImage(String filename)

下 面是使用Toolkit的getImage
方法的幾個例子。雖然每個Java程式和applet都可以使用這些方法, 但是 applets受通常的安 全限制。特別的,不被信任的applets
不能成功的為getImage指定一個檔案名稱,因為不被信任的applets不能從本機檔案系統載入資料。你 可以從
安全限制找到有關不被信任的applets的限制方面資料.

Java代碼
  1. Toolkit toolkit = Toolkit.getDefaultToolkit();   
  2. Image image1 = toolkit.getImage("imageFile.gif");   
  3. Image image2 = toolkit.getImage(   
  4.      new URL("http://java.sun.com/graphics/people.gif"));  
Toolkit toolkit = Toolkit.getDefaultToolkit();Image image1 = toolkit.getImage("imageFile.gif");Image image2 = toolkit.getImage(     new URL("http://java.sun.com/graphics/people.gif"));

Applet類提供兩個getImage
方法:

Image getImage(URL url)
Image getImage(URL url, String
name)
只 有applets 可以使用Applet 的getImage 方法。而且Applet 的getImage 方法只有在完整的背景
(AppletContext)下才能工作。因為這個原因,這些方法在構造方法或者在一個聲明一個執行個體變數的申明裡面不能工作。你應該從一個像init這
樣的方法裡面調用getImage。

下面的代碼範例示範了如何使用Applet 的code>getImage 方法。參考
使用AWT建立一個GUI 得到getCodeBase和getDocumentBase
方法的解釋。

//在Applet子類的一個方法裡:
Image image1 = getImage(getCodeBase(),
"imageFile.gif");
Image image2 = getImage(getDocumentBase(),
"anImageFile.jpeg");
Image image3 = getImage(
     new
URL("http://java.sun.com/graphics/people.gif"));

請求和跟蹤映像載入: MediaTracker
和 ImageObserver
你 可以以兩種方法跟蹤映像載入: MediaTracker 類和 ImageObserver 介面。
MediaTracker 類對於很多程式是足夠 的。你僅僅需要建立一個MediaTracker
執行個體,告訴它跟蹤一個或者多個映像,然後如果需要的話向MediaTracker 查詢那些映像的狀 態。在
提高映像動畫的外觀和效能裡面有一個範例的解釋。
動畫範例展示了MediaTracker的兩個特別有用的特性:請求一組映像資料的加
載並且等待它們完成載入。請求一組映像資料載入可以使用checkID和checkAll 的帶一個布爾參數的形式。將參數設定為 true可以開始載入
任何還未被載入的映像。或者你可以請求載入映像然後使用waitForID和waitForAll方法等待。

ImageObserver
介面可以運行你進行比MediaTracker更緊密的跟蹤。 Component 類使用它,因此組件在它們要顯示的映像被載入後進行重新繪製。為了使 用
ImageObserver 介面,你需要實現ImageObserver的 imageUpdate 方法並且確保實現的對象被註冊為一個映像觀察
器。通常,這個註冊發生在你為drawImage方法指定一個ImageObserver,就像在稍後一節描述的那樣。 imageUpdate 方法在
映像的資訊可見的任何時候被調用。

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

用MemoryImageSource建立映像
在像 MemoryImageSource
類這樣的映像生產者的協助下,你可以從你的幸手塗鴉上構造映像。下面的代碼範例打算建立一個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));

顯示映像
下面的代碼在組件地區的左上方(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值,雖然這個值很少被使用。如果映像映像已經被完全載入並且因此被完全繪製,傳回值是true;否則,傳回值是false。

Java代碼
  1. boolean drawImage(Image img, int x, int y, ImageObserver observer) 
      
  2. boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) 
      
  3. boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) 
      
  4. boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)   
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
方法有下面的參數:
Image img
需要繪製的映像。
int x, int y
映像左上方座標。
int width, int
height
映像的寬度和高度(單位為象素)。
Color
bgcolor
映像下面的顏色。如果映像包含透明象素時這會有用,映像將在指定顏色背景下顯示。
ImageObserver
observer
一個實現ImageObserver
介面的對象。它將該對象登記為一個映像觀察者,因此當映像的任何新資訊可見時它被通知。大多組件可以簡單的指定this。
組件可以指定this作為映像觀察者的原因是Component
類實現了ImageObserver 介面。當映像資料被載入時它的實現調用repaint方法,這通常是你所期望的。
drawImage
方法只要要顯示的映像資料已經載入完就返回。如果你要確保drawImage只繪製完整的映像,那麼你需要跟蹤映像的載入。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.