掌握 Java Graphics.drawImage() 進階用法,實現圖片縮放顯示、水平翻轉鏡像效果。代碼精簡展示核心參數含義,適合快速理解 2D 圖形變換基礎。
import javax.swing.*;
import java.awt.*;
class ImgDemo extends JFrame {
Image image;
ImgDemo(String filename) {
setTitle("drawImage Example");
image = getToolkit().getImage(filename); // 異步載入
setIconImage(image);
setSize(600, 250);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setVisible(true);
}
public void paint(Graphics g) {
Insets insets = getInsets();
int x = insets.left, y = insets.top;
int w = image.getWidth(this);
int h = image.getHeight(this);
// 1. 原尺寸繪製
g.drawImage(image, x, y, this);
// 2. 縮放 1/4 繪製(帶邊框)
g.drawRect(x, y, w/4 + 1, h/4 + 1);
g.drawImage(image, x + 1, y + 1, w/4, h/4, this);
// 3. 水平翻轉(鏡像)
// drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer)
// 目標區域:[x+w, y] 到 [x+2w, y+h]
// 來源區域:[w, 0] 到 [0, h](X 軸反向)
g.drawImage(image, x + w, y, x + 2*w, y + h, w, 0, 0, h, this);
}
public static void main(String[] args) {
if (args.length == 1) new ImgDemo(args[0]);
else System.err.println("Usage: java ImgDemo image-file");
}
}
g.drawImage(Image img,
int dx1, int dy1, int dx2, int dy2, // 目標矩形:左上 (dx1,dy1) 右下 (dx2,dy2)
int sx1, int sy1, int sx2, int sy2, // 來源矩形:左上 (sx1,sy1) 右下 (sx2,sy2)
ImageObserver observer)
| 參數組 | 本例數值 | 效果 |
|---|---|---|
| 目標區域 | (x+w, y) → (x+2w, y+h) | 原圖右側放置翻轉後圖片 |
| 來源區域 | (w, 0) → (0, h) | X 座標從 w 到 0 反向採樣,實現水平鏡像 |
getToolkit().getImage() 立即返回,背景載入;ImageObserver(此處為 this)接收載入通知觸發重繪。MediaTracker 或 ImageIO.read()(同步、支援更多格式)。drawImage 預設快速縮放,高品質需用 Graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR)。Graphics2D.drawImage(img, AffineTransform, observer)。
// 垂直翻轉
g.drawImage(image, x, y + h, x + w, y, 0, h, w, 0, this);
// 旋轉 90 度
Graphics2D g2 = (Graphics2D) g;
AffineTransform at = AffineTransform.getRotateInstance(Math.PI/2, x + w/2, y + h/2);
g2.drawImage(image, at, this);
// 高品質縮放
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2.drawImage(image, x, y, w/2, h/2, this);