转自: baby6 - ( http://baby66.bokee.com/6557235.html ) 

昨天在网上找了一段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;
}