首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 圖片處理入門:縮放、翻轉與繪製的 Graphics 進階技巧

     編輯:Java 相關知識

掌握 Java Graphics.drawImage() 進階用法,實現圖片縮放顯示、水平翻轉鏡像效果。代碼精簡展示核心參數含義,適合快速理解 2D 圖形變換基礎。

核心類別:ImgDemo


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");
    }
}

drawImage 九參數版完整解析


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:若需同步等待載入完成,可用 MediaTracker 或 ImageIO.read()(同步、支援更多格式)。
  • 縮放品質:drawImage 預設快速縮放,高品質需用 Graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR)。
  • AffineTransform:複雜變換(旋轉、傾斜、組合)建議用 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);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved