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

J2ME 圖片翻轉效果實作:水平/垂直鏡像像素級演算法與完整範例程式碼

     編輯:J2ME

為節省 JAR 空間,遊戲常需以單一圖片經程式翻轉產生鏡像幀(如角色朝左/右)。本文提供水平/垂直翻轉完整演算法與可直接執行的 MIDlet 範例。

核心原理:Clip 區域逐行/逐欄繪製

  • 水平翻轉(左右鏡像):逐欄處理,第 i 欄繪製原圖第 w-1-i 欄
  • 垂直翻轉(上下鏡像):逐列處理,第 i 列繪製原圖第 h-1-i 列

關鍵技巧:Graphics.setClip(x, y, w, h) 限制繪製區域,配合 drawImage() 偏移座標實現像素級複製。

完整可執行範例程式碼


package imageflip;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class FlipDemoMIDlet extends MIDlet {
    private Display display;
    private FlipCanvas canvas;

    protected void startApp() {
        display = Display.getDisplay(this);
        canvas = new FlipCanvas();
        display.setCurrent(canvas);
    }
    protected void pauseApp() {}
    protected void destroyApp(boolean u) {}
}

class FlipCanvas extends Canvas {
    private Image srcImg;

    public FlipCanvas() {
        try { srcImg = Image.createImage("/leaf.png"); }
        catch (Exception e) { e.printStackTrace(); }
    }

    protected void paint(Graphics g) {
        // 清背景
        g.setColor(0xFFFFFF);
        g.fillRect(0, 0, getWidth(), getHeight());

        int imgW = srcImg.getWidth();
        int imgH = srcImg.getHeight();
        int gap = 5;

        // 1. 原圖
        g.drawImage(srcImg, 0, 0, Graphics.TOP | Graphics.LEFT);

        // 2. 水平翻轉
        drawHFlip(g, srcImg, 0, imgH + gap);

        // 3. 垂直翻轉
        drawVFlip(g, srcImg, 0, 2*imgH + 2*gap);
    }

    // 水平翻轉:左右鏡像
    private void drawHFlip(Graphics g, Image img, int x, int y) {
        if (img == null) return;
        int w = img.getWidth();
        int h = img.getHeight();
        for (int i = 0; i < w; i++) {
            g.setClip(x + i, y, 1, h);  // 單欄裁剪區
            // 原圖對應欄:w-1-i,drawImage x 座標需抵銷
            g.drawImage(img, x - w + 1 + 2*i, y, Graphics.TOP | Graphics.LEFT);
        }
    }

    // 垂直翻轉:上下鏡像
    private void drawVFlip(Graphics g, Image img, int x, int y) {
        if (img == null) return;
        int w = img.getWidth();
        int h = img.getHeight();
        for (int i = 0; i < h; i++) {
            g.setClip(x, y + i, w, 1);  // 單列裁剪區
            g.drawImage(img, x, y - h + 1 + 2*i, Graphics.TOP | Graphics.LEFT);
        }
    }
}

執行效果

由上而下:原圖 → 水平翻轉 → 垂直翻轉

效能與替代方案比較

方法優點缺點適用場景
即時 Clip 翻轉(本文)零額外記憶體、單一源圖每幀 CPU 開銷 O(w+h)小圖片、幀率要求不高、極度省空間
預處理建立翻轉 Image繪製極快、無運算記憶體 ×2~4大圖片、高幀率、記憶體充足
Sprite/MIDP 2.0 GameCanvas硬體加速、內建 transform需 MIDP 2.0現代裝置首選

進階擴展

  • 90° 旋轉:座標變換 (x, y) → (y, w-1-x),同樣用 Clip 逐像素
  • 任意角度/縮放:需雙線性插值,純 Java 實作極慢,建議離線預渲染或用廠商擴展 API(如 Nokia UI DirectGraphics)
  • 透明色保留:createRGBImage() + getRGB()/drawRGB() 處理 ARGB,記憶體/CPU 雙重壓力大
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved