zoukankan      html  css  js  c++  java
  • 图片放大缩小算法——差值法

     

    /*********************************
    * @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(); //
    原始图像高

    short[] srcBuf = new short[srcW * srcH]; //原始图片像素信息缓存

    //srcBuf获取图片像素信息
    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);
    }

    //计算插值表
    short[] tabY = new short[desH];
    short[] tabX = new short[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] = (short) 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
    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;

     

     

     

     

    有一个超简单的办法,你可以对小图片的开头和结尾取样,然后在大图片中搜索。。。这个代码写的不够严谨,不过

    byte[] smallPic=....
    byte[] bigPic=...

    long[] bigLongPic=
    bigPic变成long类型 //转换成long可加快搜索速度

    long start=ToLong(smallPic,true);
    long end=ToLong(smallPic,false);
    int offset=smallPic.length-16;
     //保存小图片开头到结尾的取样点的偏移

    for(int i=0;i<bigLongPic.length;i++){
        if(bigLongPic[i]==start && bigLongPic[i+offset]==end){ //
    比较取样点
             //
    这里再具体的比较
        }
    }

    private long ToLong(byte [] ba,bool start){
     long r=0;
     if(start){
     for(int i=0;i<8;i++)r|=ba[i]<<(8-i);
     }
     else{
     for(int i=ba.length-1,j=0;i>=0;i--,j++)r|=ba[i]<<(i-j);
    }

    不进则退、与时俱进
  • 相关阅读:
    Java在Web开发语言上败给了PHP(转)
    很开心收到了Andreas Loew发给我的注册key
    Cocos2d-x开发移植到安卓平台横竖屏设置及相关
    学习实战二:利用Cocos2d-x写的第一个游戏
    Cocos2d-x项目移植到安卓平台易出现的错误
    cocos2d-x帧动画实现(写下备忘)
    cocos2d-x学习遇到的问题
    C++指针的管理
    Win7开自带的虚拟WIFI
    【SICP练习】21 练习1.27
  • 原文地址:https://www.cnblogs.com/wenrenhua08/p/3993656.html
Copyright © 2011-2022 走看看