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 為定點數近似的反向映射getRGB() 陣列處理,效能大幅下降)| 原始尺寸 | 目標尺寸 | 操作 | 耗時 | 主觀流暢度 |
|---|---|---|---|---|
| 60×60 | 30×30 | 縮小 50% | < 50ms | 極快,遊戲循環無感 |
| 60×60 | 120×120 | 放大 200% | ~150~200ms | 稍有卡頓,非高頻調用可接受 |