J2ME圖片縮放

來源:互聯網
上載者:User

 

這個函數是我以前在網上搜羅到的,且不談效果,效能什麼的。只覺得它非常好用。
用了很長時間,可惜不知道是誰。真要謝謝這位作者了。
這個函數使用了midp2.0的getRGB()函數,效率不錯,基本上沒什麼可最佳化的了。

  1. public static Image ZoomImage(Image src, int desW, int desH) {
  2.   Image desImg = null;
  3.   int srcW = src.getWidth(); // 原始映像寬
  4.   int srcH = src.getHeight(); // 原始映像高
  5.   int[] srcBuf = new int[srcW * srcH]; // 原始圖片像素資訊緩衝
  6.   src.getRGB(srcBuf, 0, srcW, 0, 0, srcW, srcH);
  7.   // 計算插值表
  8.   int[] tabY = new int[desH];
  9.   int[] tabX = new int[desW];
  10.   int sb = 0;
  11.   int db = 0;
  12.   int tems = 0;
  13.   int temd = 0;
  14.   int distance = srcH > desH ? srcH : desH;
  15.   for (int i = 0; i <= distance; i++) { /* 垂直方向 */
  16.    tabY[db] = sb;
  17.    tems += srcH;
  18.    temd += desH;
  19.    if (tems > distance) {
  20.     tems -= distance;
  21.     sb++;
  22.    }
  23.    if (temd > distance) {
  24.     temd -= distance;
  25.     db++;
  26.    }
  27.   }
  28.   sb = 0;
  29.   db = 0;
  30.   tems = 0;
  31.   temd = 0;
  32.   distance = srcW > desW ? srcW : desW;
  33.   for (int i = 0; i <= distance; i++) { /* 水平方向 */
  34.    tabX[db] = (short) sb;
  35.    tems += srcW;
  36.    temd += desW;
  37.    if (tems > distance) {
  38.     tems -= distance;
  39.     sb++;
  40.    }
  41.    if (temd > distance) {
  42.     temd -= distance;
  43.     db++;
  44.    }
  45.   }
  46.   // 產生放大縮小後圖形像素buf
  47.   int[] desBuf = new int[desW * desH];
  48.   int dx = 0;
  49.   int dy = 0;
  50.   int sy = 0;
  51.   int oldy = -1;
  52.   for (int i = 0; i < desH; i++) {
  53.    if (oldy == tabY[i]) {
  54.     System.arraycopy(desBuf, dy - desW, desBuf, dy, desW);
  55.    } else {
  56.     dx = 0;
  57.     for (int j = 0; j < desW; j++) {
  58.      desBuf[dy + dx] = srcBuf[sy + tabX[j]];
  59.      dx++;
  60.     }
  61.     sy += (tabY[i] - oldy) * srcW;
  62.    }
  63.    oldy = tabY[i];
  64.    dy += desW;
  65.   }
  66.   // 產生圖片
  67.   desImg = Image.createRGBImage(desBuf, desW, desH, false);
  68.   return desImg;
  69.  }

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.