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

J2ME 技術筆記:MIDP 環境下實現圖片縮放演算法

     編輯:Java 程式設計入門

問題背景

MIDP 1.0 與 2.0 均未提供原生圖片縮放 API。若需將 16×16 圖片放大為 32×32 或縮小為 8×8,必須自行實作像素級插值演算法。雖然效果不如美術預先製作的多解析度素材,且會帶來效能開銷,但在動態 UI 或跨裝置適配場景極具實用價值。

核心演算法:雙通道雙線性採樣

縮放原理為先水平後垂直兩次一維線性插值:

  1. 建立中介圖片 tmp (新寬 × 原高),對每一目標列 x,計算源圖對應列 x * srcW / newW,以 setClip(x, 0, 1, srcH) 限制繪製區域,呼叫 drawImage 將源圖對應列畫入 tmp。
  2. 建立目標圖片 dst (新寬 × 新高),對每一目標行 y,計算源圖對應行 y * srcH / newH,以 setClip(0, y, newW, 1) 限制區域,將 tmp 對應行畫入 dst。

此法時間複雜度 O(newW × srcH + newW × newH),遠優於雙重迴圈逐像素採樣的 O(newW × newH × srcW × srcH)。實測全螢幕放大:雙通道法約 60 ms,雙重迴圈法高達 7150 ms。

完整工具類程式碼

public class ImageUtil {
    public static final Image scale(Image srcImage, int newW, int newH) {
        int srcW = srcImage.getWidth();
        int srcH = srcImage.getHeight();

        // 水平縮放
        Image tmp = Image.createImage(newW, srcH);
        Graphics g = tmp.getGraphics();
        for (int x = 0; x < newW; x++) {
            g.setClip(x, 0, 1, srcH);
            g.drawImage(srcImage, x - x * srcW / newW, 0, Graphics.LEFT | Graphics.TOP);
        }

        // 垂直縮放
        Image dst = Image.createImage(newW, newH);
        g = dst.getGraphics();
        for (int y = 0; y < newH; y++) {
            g.setClip(0, y, newW, 1);
            g.drawImage(tmp, 0, y - y * srcH / newH, Graphics.LEFT | Graphics.TOP);
        }
        return dst;
    }
}

效能對比圖示:

原始圖片 16×16

放大至全螢幕

縮小至 1/4

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