程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> 優化後的圖片插值算法

優化後的圖片插值算法

編輯:J2ME

昨天在網上找了一段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;}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved