MIDP 1.0 與 2.0 均未提供原生圖片縮放 API。若需將 16×16 圖片放大為 32×32 或縮小為 8×8,必須自行實作像素級插值演算法。雖然效果不如美術預先製作的多解析度素材,且會帶來效能開銷,但在動態 UI 或跨裝置適配場景極具實用價值。
縮放原理為先水平後垂直兩次一維線性插值:
tmp (新寬 × 原高),對每一目標列 x,計算源圖對應列 x * srcW / newW,以 setClip(x, 0, 1, srcH) 限制繪製區域,呼叫 drawImage 將源圖對應列畫入 tmp。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;
}
}
效能對比圖示:


