| 特性 | 雙線性插值 (Bilinear) - MIDP 2.0 | 最近鄰 + 可變圖像 - MIDP 1.0 |
|---|---|---|
| API 需求 | Image.getRGB, createRGBImage | Graphics.setClip, drawImage |
| 畫質 | 平滑、無鋸齒 | 明顯鋸齒、像素化 |
| 速度 | 較慢(純 Java 運算) | 極慢(逐像素 setClip/drawImage) |
| 記憶體 | 兩倍像素陣列 | 兩張可變圖像緩衝 |
核心思想:建立目標座標到來源座標的映射表(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++; }
}
}
利用 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;
}
Image.createImage(src, 0,0,w,h, dstW,dstH, transform))。