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

J2ME 圖片變換工具類:旋轉 90/180/270 度、鏡像、組合變換完整實現

     編輯:J2ME

變換類型常量定義 (兼容 Sprite 變換常量)

public final static int TRANS_NONE           = 0; // 無變化
public final static int TRANS_ROT90          = 5; // 順時針 90°
public final static int TRANS_ROT180         = 3; // 順時針 180°
public final static int TRANS_ROT270         = 6; // 順時針 270°
public final static int TRANS_MIRROR         = 2; // 水平鏡像
public final static int TRANS_MIRROR_ROT90   = 7; // 鏡像 + 90°
public final static int TRANS_MIRROR_ROT180  = 1; // 鏡像 + 180°
public final static int TRANS_MIRROR_ROT270  = 4; // 鏡像 + 270°

核心變換方法

public static Image transformImage(Image src, int transform) {
    int srcW = src.getWidth();
    int srcH = src.getHeight();
    Image dest = null;

    switch (transform) {
        case TRANS_NONE:
            return src;

        case TRANS_ROT90:      // 90°: (w,h) -> (h,w), 行變列,列逆序
            dest = Image.createImage(srcH, srcW);
            for (int y = 0; y < srcH; y++) {
                src.getRGB(lineBuf, 0, srcW, 0, y, srcW, 1);
                dest.getGraphics().drawRGB(lineBuf, 0, 1, srcH - y - 1, 0, 1, srcW, true);
            }
            break;

        case TRANS_ROT180:     // 180°: 尺寸不變,每行像素逆序,行順序逆序
            dest = Image.createImage(srcW, srcH);
            for (int y = 0; y < srcH; y++) {
                src.getRGB(lineBuf, 0, srcW, 0, y, srcW, 1);
                reverse(lineBuf); // 水平鏡像
                dest.getGraphics().drawRGB(lineBuf, 0, srcW, 0, srcH - y - 1, srcW, 1, true);
            }
            break;

        case TRANS_ROT270:     // 270°: (w,h) -> (h,w), 行變列,列順序
            dest = Image.createImage(srcH, srcW);
            for (int y = 0; y < srcH; y++) {
                src.getRGB(lineBuf, 0, srcW, 0, y, srcW, 1);
                reverse(lineBuf);
                dest.getGraphics().drawRGB(lineBuf, 0, 1, y, 0, 1, srcW, true);
            }
            break;

        case TRANS_MIRROR:     // 水平鏡像: 尺寸不變,每行像素逆序
            dest = Image.createImage(srcW, srcH);
            for (int y = 0; y < srcH; y++) {
                src.getRGB(lineBuf, 0, srcW, 0, y, srcW, 1);
                reverse(lineBuf);
                dest.getGraphics().drawRGB(lineBuf, 0, srcW, 0, y, srcW, 1, true);
            }
            break;

        case TRANS_MIRROR_ROT90:   // 鏡像+90°
            dest = Image.createImage(srcH, srcW);
            for (int y = 0; y < srcH; y++) {
                src.getRGB(lineBuf, 0, srcW, 0, y, srcW, 1);
                reverse(lineBuf);
                dest.getGraphics().drawRGB(lineBuf, 0, 1, srcH - y - 1, 0, 1, srcW, true);
            }
            break;

        case TRANS_MIRROR_ROT180:  // 鏡像+180° = 垂直鏡像
            dest = Image.createImage(srcW, srcH);
            for (int y = 0; y < srcH; y++) {
                src.getRGB(lineBuf, 0, srcW, 0, y, srcW, 1);
                dest.getGraphics().drawRGB(lineBuf, 0, srcW, 0, srcH - y - 1, srcW, 1, true);
            }
            break;

        case TRANS_MIRROR_ROT270:  // 鏡像+270°
            dest = Image.createImage(srcH, srcW);
            for (int y = 0; y < srcH; y++) {
                src.getRGB(lineBuf, 0, srcW, 0, y, srcW, 1);
                dest.getGraphics().drawRGB(lineBuf, 0, 1, y, 0, 1, srcW, true);
            }
            break;

        default:
            return src;
    }
    return dest;
}

輔助:單行像素數組逆序 (水平鏡像核心)

private static final int[] lineBuf = new int[MAX_WIDTH]; // 靜態複用,避免頻繁分配

public static final void reverse(int[] arr) {
    int len = arr.length;
    for (int i = 0, j = len - 1; i < j; i++, j--) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

算法圖解 (以 3x4 圖片為例)

原圖:           目標 (ROT90):
1 2 3 4         9 5 1
5 6 7 8   -->   10 6 2
9 10 11 12      11 7 3
                12 8 4

註釋中包含所有 8 種變換的像素映射圖,便於理解驗證。

性能與內存優化點

  1. 單行緩衝區複用:lineBuf 靜態分配最大寬度,避免循環中頻繁 new int[] 觸發 GC。
  2. 就地逆序:reverse() 原地交換,無額外內存。
  3. drawRGB 直接寫入目標圖片:無中間對象,像素級操作最高效。

使用場景

  • 游戲角色面向轉向 (左/右鏡像、旋轉)。
  • UI 組件動態旋轉 (如指南針、儀表盤)。
  • 圖片預處理:生成多方向 Sprite 幀,運行時直接切換,避免實時計算。

總結

基於 Image.getRGB + Graphics.drawRGB 實現 8 種幾何變換,算法清晰、性能優化到位、兼容 Sprite 變換常量,是 J2ME 圖形處理的基礎工具類。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved