昨天在網上找了一段J2ME下的圖片插值算法,不過這段算法需要nokiaui的支撐,但是並不是所有手機都支撐nokiaui的擴大包,而且這個算法巨費內存。
我把它修正了一下,改為對某行插值的時候才把原圖的對應的那行數據取出來,然後再把這行畫在一張圖片上,這樣避免了結構兩個很大的int數組,從而可以省許多內存,
/************************************************************ * @todo 圖片放大縮小 * @param srcImg 原始圖片 * @param desW 變更後圖片的寬 * @param desH 變更後圖片的高 * @return 處理後的圖片 ************************************************************/private Image ZoomImage(Image srcImg, int desW, int desH) { int srcW = srcImg.getWidth(); // 原始圖像寬 int srcH = srcImg.getHeight(); // 原始圖像高 // 盤算插值表 int[] tabY = new int[desH]; int[] tabX = new int[desW]; int sb = 0; int db = 0; int tems = 0; int temd = 0; int distance = srcH > desH ? srcH : desH; for (int i = 0; i <= distance; i++) { /* 垂直方向 */ tabY[db] = sb; tems += srcH; temd += desH; if (tems > distance) { tems -= distance; sb++; } if (temd > distance) { temd -= distance; db++; } } sb = 0; db = 0; tems = 0; temd = 0; distance = srcW > desW ? srcW : desW; for (int i = 0; i <= distance; i++) { /* 程度方向 */ tabX[db] = sb; tems += srcW; temd += desW; if (tems > distance) { tems -= distance; sb++; } if (temd > distance) { temd -= distance; db++; } } System.out.println((Runtime.getRuntime().freeMemory() / 1024)); // 天生放大縮小後圖形像素buf Image desImg = Image.createImage(desW, desH); Graphics gs = desImg.getGraphics(); int dx = 0; int oldy = -1; int[] srcBuf = new int[srcW]; int[] desBuf = new int[desW]; int[] lastRow = new int[desW]; for (int i = 0; i < desH; i++) { if (oldy == tabY
[i]) { // 當上一行與即將要天生的這一行雷同時,就直接copy了 System.arraycopy(lastRow, 0, desBuf, 0, desW); } else { // 插值算出新圖片的一行 // 插值一行,就從原圖中取一行數據 srcImg.getRGB(srcBuf, 0, srcW, 0, dx, srcW, 1); for (int j = 0; j < desW; j++) { desBuf[j] = srcBuf[tabX[j]]; } dx++; } System.arraycopy(desBuf, 0, lastRow, 0, desW); oldy = tabY[i]; gs.drawRGB(desBuf, 0, desW, 0, i, desW, 1, false); } return desImg;}