J2ME插值算法实现图片的放大缩小[2]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

    sb = 0;
    db = 0;
    tems = 0;
    temd = 0;
    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++;
      }
    }

    //生成放大缩小后图形像素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]) {
        System.arraycopy(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 = Image.createImage(desW, desH);
    DirectUtils.getDirectGraphics(desImg.getGraphics()).
        drawPixels(desBuf, true, 0, desW, 0, 0, desW, desH, 0, 444);
    return desImg;
  }

首先看函数的头两句,很容易,就是获取原始图片的宽度和高度
    int srcW = srcImg.getWidth(); //原始图像宽
    int srcH = srcImg.getHeight(); //原始图像高
接下来一句我们要定义一个short型数组,作为获取原始图片像素信息的缓存
short[] srcBuf = new short[srcW * srcH];

再下来一段,有的朋友可能会有些不明白,这里要解释一下。由于getPixels()这个函数,只能获取可变图像的像素信息,非可变图像,无法获取像素信息。所以我们要用srcImg.isMutable() 来判断,原始图像是不是可变图像,然后分两种情况来处理。如果srcImg是可变图像,我们就直接用getPixels()来获取它的像素信息,并保存在srcBuf里。如果srcImg不是可变图像,我们就需要把srcImage画到事先生成的可变图像desImg上,然后再获取desImg的像素信息。
    Image desImg = Image.createImage(srcW, srcH);
    if (srcImg.isMutable()) { /*如果是可变图像*/
      DirectUtils.getDirectGraphics(srcImg.getGraphics()).
          getPixels(srcBuf, 0, srcW, 0, 0, srcW, srcH, 444);
    } else { /*如果是非可变图像*/
      desImg.getGraphics().drawImage(srcImg, 0, 0, 0);
      DirectUtils.getDirectGraphics(desImg.getGraphics()).
          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++;
      }
    }

本文关键:J2ME插值算法实现图片的放大缩小
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top