J2ME图像缩放线性插值算法代码

在这里对算法的作者表示敬意, 从网上找来的, 不知道作者的名字, 只能表示遗憾了 :o(

较多使用的第一种:

public static Image ZoomImage(Image src, int desW, int desH) {
    Image desImg = null;
    int srcW = src.getWidth(); // 原始图像宽
    int srcH = src.getHeight(); // 原始图像高
    int[] srcBuf = new int[srcW * srcH]; // 原始图片像素信息缓存

    src.getRGB(srcBuf, 0, srcW, 0, 0, srcW, srcH);

    // 计算插值表
    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] = (short) sb;
     tems += srcW;
     temd += desW;
     if (tems > distance) {
      tems -= distance;
      sb++;
     }
     if (temd > distance) {
      temd -= distance;
      db++;
     }
    }

    // 生成放大缩小后图形像素buf
    int[] desBuf = new int[desW * desH];
    int dx = 0;
    int dy = 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.createRGBImage(desBuf, desW, desH, false);
    return desImg;
 }

 

第二种较少使用适合midp1.0

public static Image scaleImage (Image src, int dstW, int dstH) {
   
   int srcW = src.getWidth();
   
   int srcH = src.getHeight();
   

   
   Image tmp = Image.createImage(dstW, srcH);
   
   Graphics g = tmp.getGraphics();
  

   
   int delta = (srcW << 16/ dstW;
   
   int pos = delta/2;
   

   
   for (int x = 0; x < dstW; x++) {
   
   g.setClip(x, 01, srcH);
  
    g.drawImage(src, x - (pos >> 16), 0, Graphics.LEFT | Graphics.TOP);
   
   pos += delta;
   
  }
   
  Image dst = Image.createImage(dstW, dstH);
   
  g = dst.getGraphics();
   

  
   delta = (srcH << 16/ dstH;
  
   pos = delta/2;
   

  
   for (int y = 0; y < dstH; y++) {
  
   g.setClip(0, y, dstW, 1);
   
  g.drawImage(tmp, 0, y - (pos >> 16), Graphics.LEFT | Graphics.TOP);
   
  pos += delta;
   
 }
    return dst;
   
 }
   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值