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

Java 2D 圖形程式設計:BufferedImage 動態建立圖像、像素操作與動畫實戰

     編輯:Java 程式設計入門

無需讀取檔案,Java 即可純代碼生成圖像。BufferedImage 提供記憶體內像素緩衝區,支援多種色彩模型與 Alpha 透明通道,是動態繪圖、圖像合成、驗證碼生成、圖表繪製的核心工具。

建立 BufferedImage

int width = 200, height = 300;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
// TYPE_INT_ARGB:每像素 32 位元,含 Alpha + RGB,最通用

取得繪圖上下文

Graphics2D g2d = image.createGraphics();
// 設定抗鋸齒、描繪屬性、仿射變換等
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

像素級讀寫

// 讀取單像素 (ARGB 打包 int)
int argb = image.getRGB(x, y);
int alpha = (argb >> 24) & 0xFF;
int red   = (argb >> 16) & 0xFF;
int green = (argb >> 8)  & 0xFF;
int blue  = argb & 0xFF;

// 寫入單像素
image.setRGB(x, y, (alpha << 24) | (red << 16) | (green << 8) | blue);

// 批次讀寫
int[] pixels = image.getRGB(0, 0, width, height, null, 0, width);
image.setRGB(0, 0, width, height, pixels, 0, width);

動畫 Applet 骨架

public class ImageDrawDemo extends JApplet {
    BufferedImage offscreen;      // 雙緩衝離屏圖像
    Thread animator;
    volatile boolean running;

    public void init() {
        offscreen = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
        // 載入背景 Logo 等靜態資源
    }

    public void start() {
        running = true;
        animator = new Thread(() -> {
            while (running) {
                updateFrame();
                repaint(); // 觸發 paint()
                try { Thread.sleep(30); } catch (InterruptedException ignored) {}
            }
        });
        animator.start();
    }

    public void stop() { running = false; }

    void updateFrame() {
        Graphics2D g = offscreen.createGraphics();
        // 清背景、繪製動態圖形、合成 Logo、套用透明度漸變等
        g.dispose();
    }

    public void paint(Graphics g) {
        g.drawImage(offscreen, 0, 0, this); // 雙緩衝輸出,無閃爍
    }
}

關鍵技巧總結

  • 離屏緩衝:`BufferedImage` + `paint()` 直接繪製,消除閃爍。
  • Alpha 合成:`AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)` 實現淡入淡出、半透明疊加。
  • 仿射變換:`g2d.translate/rotate/scale/shear` 實現旋轉、縮放、傾斜動畫。
  • 效能:大量像素操作考慮 `DataBufferInt` 直接存取底層陣列,避免 `getRGB/setRGB` 方法呼叫開銷。
BufferedImage 讓 Java 擁有類似 C 語言直接操作顯存的能力,是客製化視覺元件、遊戲引擎原型、科學視覺化的利器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved