合成圖像
您不必從文件中讀取所有的圖像 — 您可以創建自己的圖像。要創建自己的圖像,最靈活的方法是用一個 BufferedImage 對象,它是 Image 類的一個子類,它把圖像數據存儲在一個可以被訪問的緩沖區中。它還支持各種存儲像素數據的方法:使用或不使用 alpha 通道、不同種類的顏色模型以及顏色組件的各種精確度。ColorModel 類提供一種靈活的方法定義各種顏色模型,以和 BufferedImage 對象一起使用。為了理解顏色模型工作的基本知識,我們將只使用一個缺省的顏色模型,其顏色組件由 RGB 值和一個緩沖類型(存儲 8 位的 RGB 顏色值加上一個 alpha 通道)組成。這一緩沖類型由 BufferedImage 類中的常量 TYPE_INT_ARGB 指定,它意味著每個像素要用一個 int 值。每個像素的值是以 8 位字節形式存儲一個 alpha 組件加上 RGB 顏色組件。我們可以用給定的寬度和高度創建一個這種類型的 BufferedImage 對象,代碼語句如下:
int width = 200;
int height = 300;
BufferedImage image = new BufferedImage(width,
height,BufferedImage.TYPE_INT_ARGB);
這段代碼創建了一個 BufferedImage 對象,它代表一個 200 像素寬、300 像素高的圖像。為了應用這個圖像,我們需要有圖形上下文,而 BufferedImage 對象的 createGraphics() 方法就返回一個與該圖像相關的 Graphics2D 對象:
int width = 200;
Graphics2D g2D = image.createGraphics();
使用 g2D 對象的操作會修改 BufferedImage 對象 image 的像素。利用這個對象,您現在完全有能力應用 BufferedImage 對象。您可以繪制形狀、圖像、GeneralPath 對象或任何別的東西,還可以為圖形上下文設置 alpha 組合對象。您同時還擁有 Graphics2D 對象提供的全部仿射變形能力。
如果要從 BufferedImage 對象獲取單個像素,可以通過調用它的 getRGB() 方法,並提供該像素的 x,y 坐標作為 int 類型的參數。這個像素會按 TYPE_INT_ARGB 格式以 int 類型返回,它由四個 8 位的值(代表 alpha 值和 RGB 顏色組件)組成一個 32 位字。同時 getRGB() 還有一個重載的版本,它從一部分圖像數據中返回一個像素數組。您也可以通過調用 setRGB() 方法來設置單個像素。前兩個參數是該像素的坐標值,第三個參數是待設定的值,類型為 int。這個方法也有一個版本可以設置像素數組的值。
至此我們已經完成了像素操作的學習。下面我們要建立一個 applet,它在 Wrox 徽標背景上使 BufferedImage 對象具有動畫效果。我們的示例還將演示怎樣能讓圖像局部透明。applet 的基本內容如下所示:
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import javax.swing.*;
public class ImageDrawDemo extends JApplet
{
// The init() method to initialize everything...
// The start() method to start the animation...
// The stop() method to stop the animation...
// The ImagePanel class defining the panel displaying the animation...
// Data members for the applet...
}