當前位置:文思屋>社會工作>IT認證>

J2ME插值演算法如何實現圖片的放大縮小

文思屋 人氣:6.04K

//生成放大縮小後圖形畫素buf

short[] desBuf = new short[desW * desH];

int dx = 0;

int dy = 0;

int sx = 0;

int sy = 0;

int oldy = -1;

for (int i = 0; i < desH; i++) {

if (oldy == tabY[i]) {

ycopy(desBuf, dy - desW, desBuf, dy, desW);

} else {

dx = 0;

for (int j = 0; j < desW; j++) {

desBuf[dy + dx] = srcBuf[sy + tabX[j]];

dx++;

}

sy += (tabY[i] - oldy) * srcW;

}

oldy = tabY[i];

dy += desW;

}

//生成圖片

desImg = teImage(desW, desH);

irectGraphics(raphics()).

drawPixels(desBuf, true, 0, desW, 0, 0, desW, desH, 0, 444);

return desImg;

}

首先看函式的頭兩句,很容易,就是獲取原始圖片的寬度和高度


  int srcW = idth(); //原始影象寬 
  int srcH = eight(); //原始影象高

接下來一句我們要定義一個short型陣列,作為獲取原始圖片畫素資訊的快取


 short[] srcBuf = new short[srcW * srcH];

再下來一段,有的朋友可能會有些不明白,這裡要解釋一下。由於getPixels()這個函式,只能獲取可變影象的畫素資訊,非可變影象,無法獲取畫素資訊。所以我們要用table() 來判斷,原始影象是不是可變影象,然後分兩種情況來處理。如果srcImg是可變影象,我們就直接用getPixels()來獲取它的畫素資訊,並儲存在srcBuf裡。如果srcImg不是可變影象,我們就需要把srcImage畫到事先生成的.可變影象desImg上,然後再獲取desImg的畫素資訊。


 Image desImg = teImage(srcW, srcH); 
  if (table()) { /*如果是可變影象*/ 
  irectGraphics(raphics()). 
  getPixels(srcBuf, 0, srcW, 0, 0, srcW, srcH, 444); 
  } else { /*如果是非可變影象*/ 
  raphics()Image(srcImg, 0, 0, 0); 
  irectGraphics(raphics()). 
  getPixels(srcBuf, 0, srcW, 0, 0, srcW, srcH, 444); 
  }

再往下就是縮放演算法的重點:插值表的生成。插值表分水平差值表和垂直插值表,我們要分別生成原始影象矩陣的2種插值表,然後利用插值表生成放大縮小後的影象矩陣。由於這個內容比較抽象,很難用文字表述清楚,所以我們用例項進行介紹。

大家看下面這個水平的1*4的表格

-----------------

| 0 | 1 | 2 | 3 |

-----------------

如果要將這個表格放大成1*6的表格,放大的表格比原始表格多出了2個格子,我們只能對這多出來的2個格子進行插值,才能完成放大的操作。現在結合生成水平插值表的程式碼來完成這個過程。


 distance = srcW > desW ? srcW : desW; 
  for (int i = 0; i <= distance; i++) { /*水平方向*/ 
  tabX[db] = (short) sb; 
  tems += srcW; 
  temd += desW; 
  if (tems > distance) { 
  tems -= distance; 
  sb++; 
  } 
  if (temd > distance) { 
  temd -= distance; 
  db++; 
  } 
  }

很明顯原始表格寬度srcW = 4;放大後的表格寬度desW = 6;所以distance = desW = 6