荟萃馆

位置:首页 > IT认证 > SUN认证

J2ME插值算法如何实现图片的放大缩小

SUN认证2.55W

//生成放大缩小后图形像素buf

J2ME插值算法如何实现图片的放大缩小

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;

}

首先看函数的头两句,很容易,就是获取原始图片的宽度和高度


  intsrcW=idth();//原始图像宽
  intsrcH=eight();//原始图像高

接下来一句我们要定义一个short型数组,作为获取原始图片像素信息的缓存


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

再下来一段,有的朋友可能会有些不明白,这里要解释一下。由于getPixels()这个函数,只能获取可变图像的像素信息,非可变图像,无法获取像素信息。所以我们要用table() 来判断,原始图像是不是可变图像,然后分两种情况来处理。如果srcImg是可变图像,我们就直接用getPixels()来获取它的像素信息,并保存在srcBuf里。如果srcImg不是可变图像,我们就需要把srcImage画到事先生成的可变图像desImg上,然后再获取desImg的'像素信息。


 ImagedesImg=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(inti=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