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

J2ME 圖片縮放演算法大全:雙線性插值(MIDP 2.0)與最近鄰(MIDP 1.0)完整實作

     編輯:J2ME

兩種縮放策略對比

特性雙線性插值 (Bilinear) - MIDP 2.0最近鄰 + 可變圖像 - MIDP 1.0
API 需求Image.getRGB, createRGBImageGraphics.setClip, drawImage
畫質平滑、無鋸齒明顯鋸齒、像素化
速度較慢(純 Java 運算)極慢(逐像素 setClip/drawImage)
記憶體兩倍像素陣列兩張可變圖像緩衝

演算法一:雙線性插值(整數定點數實作,適合 MIDP 2.0)

核心思想:建立目標座標到來源座標的映射表(tabX、tabY),再按行複製像素,利用 System.arraycopy 加速相同來源行的複製。

public static Image zoomImage(Image src, int desW, int desH) {
    int srcW = src.getWidth(), srcH = src.getHeight();
    int[] srcBuf = new int[srcW * srcH];
    src.getRGB(srcBuf, 0, srcW, 0, 0, srcW, srcH);

    // 建立映射表
    int[] tabY = new int[desH];
    int[] tabX = new int[desW];
    buildMap(tabY, srcH, desH);
    buildMap(tabX, srcW, desW);

    // 產生目標像素陣列
    int[] desBuf = new int[desW * desH];
    int dy = 0, oldSy = -1;
    for (int i=0;i dist) { tems -= dist; sb++; }
        if (temd > dist) { temd -= dist; db++; }
    }
}

演算法二:最近鄰縮放(MIDP 1.0 相容,kobjects 開源碼)

利用 Graphics.setClip(x,y,1,h) 逐欄繪製水平縮放,再 setClip(0,y,w,1) 逐列繪製垂直縮放。定點數 delta = (src<<16)/dst 計算來源座標。

public static Image scaleImage(Image src, int dstW, int dstH) {
    int srcW = src.getWidth(), srcH = src.getHeight();
    // 水平縮放到中間圖
    Image tmp = Image.createImage(dstW, srcH);
    Graphics g = tmp.getGraphics();
    int delta = (srcW << 16) / dstW;
    int pos = delta/2;
    for (int x=0;x>16), 0, Graphics.LEFT|Graphics.TOP);
        pos += delta;
    }
    // 垂直縮放到目標圖
    Image dst = Image.createImage(dstW, dstH);
    g = dst.getGraphics();
    delta = (srcH << 16) / dstH;
    pos = delta/2;
    for (int y=0;y>16), Graphics.LEFT|Graphics.TOP);
        pos += delta;
    }
    return dst;
}

使用建議

  • MIDP 2.0 設備優先使用 雙線性插值,畫質佳且可接受效能。
  • MIDP 1.0 僅能用最近鄰法,建議僅在啟動時縮放一次快取,避免遊戲主迴圈即時縮放。
  • 若目標尺寸固定(如圖示 32×32),最佳做法是預先在桌面端產生多解析度圖檔,裝置端直接載入對應版本,完全避免運行時縮放。
  • 大圖縮小(如相機預覽 640×480 → 240×320)記憶體壓力大,分塊處理或使用平台原生縮放(Nokia UI API Image.createImage(src, 0,0,w,h, dstW,dstH, transform))。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved