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

J2ME 圖片縮放算法實現與效能測試

     編輯:J2ME

前言

J2ME (CLDC 1.0/MIDP 1.0) 無內建圖片縮放 API。開發 FPS 遊戲、UI 自適應等場景常需運行期縮放。本文提供基於雙重掃描線的最近鄰/雙線性插值簡化算法,並附實測效能數據。

核心算法:水平縮放 → 垂直縮放

分兩階段處理,避免二維插值的高計算量。每階段逐像素列/行複製,以定點數近似浮點比例。

public static Image scale(Image src, int newW, int newH) {
    int srcW = src.getWidth();
    int srcH = src.getHeight();

    // 階段 1:水平縮放 → 臨時圖 (newW x srcH)
    Image tmp = Image.createImage(newW, srcH);
    Graphics g = tmp.getGraphics();
    for (int x = 0; x < newW; x++) {
        g.setClip(x, 0, 1, srcH); // 僅繪製當前目標列
        // 來源 X 座標:反向映射 + 整數除法近似
        int srcX = x - (x * srcW) / newW;
        g.drawImage(src, srcX, 0, Graphics.LEFT | Graphics.TOP);
    }

    // 階段 2:垂直縮放 → 目標圖 (newW x newH)
    Image dst = Image.createImage(newW, newH);
    g = dst.getGraphics();
    for (int y = 0; y < newH; y++) {
        g.setClip(0, y, newW, 1); // 僅繪製當前目標行
        int srcY = y - (y * srcH) / newH;
        g.drawImage(tmp, 0, srcY, Graphics.LEFT | Graphics.TOP);
    }
    return dst;
}

算法解析

  • setClip 限制繪製區域為單列/單行,配合 drawImage 負座標偏移,實現「取樣複製」
  • 來源座標計算:srcCoord = dstCoord - (dstCoord * srcSize) / dstSize 為定點數近似的反向映射
  • 屬於 最近鄰插值 簡化版,速度快但放大時有鋸齒;可改進為雙線性插值 (需像素級操作,MIDP 1.0 需 getRGB() 陣列處理,效能大幅下降)

實測效能 (Nokia 3250 / 6230i)

結論:縮小 (UI 適配、縮圖) 完全可用;放大 (FPS 牆面貼圖) 需謹慎,建議預先準備多解析度素材或離線預處理。

優化建議

  1. 快取結果:同尺寸多次縮放時,用 Hashtable 快取 srcHash + newW + newH -> Image
  2. 預計算座標表:將 srcX[]、srcY[] 預陣列化,迴圈內僅查表
  3. MIDP 2.0 替代:Image.createImage(src, x, y, w, h, transform) 硬體加速,優先檢測可用性
  4. 僅縮放透明圖:配合 createRGBImage() 處理 Alpha 通道 (極慢,慎用)

適用場景總結

  • ✅ UI 圖示自適應不同解析度螢幕
  • ✅ 遊戲小地圖縮放、遠景背景縮放
  • ✅ 縮圖預覽、照片瀏覽器縮放
  • ❌ 高頻放大 (每幀牆面貼圖) → 改用多解析度素材包
  • ❌ 旋轉+縮放組合 → 需仿射變換,純 Java 實現過重
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
原始尺寸目標尺寸操作耗時主觀流暢度
60×6030×30縮小 50%< 50ms極快,遊戲循環無感
60×60120×120放大 200%~150~200ms稍有卡頓,非高頻調用可接受