设为首页 - 加入收藏 焦点技术网
热搜:java
当前位置:首页 >

java 图像特效之放大镜与哈哈镜

导读:阅读本系列,请先看前言!谢谢 放大镜与哈哈镜原理上是一样的,我们只要找到相关映射即可。如这张图所示。不同的映射会有不同的效果,如线性映射会产生放大缩小的感觉,凸函数则会是凸透镜,凹函数就是凹透镜,原则上,不同的函数就不会产生不同的结果当然对函数也有一定的要求,比如在变化区域的边缘要保持不变。说完原理,先上放大镜的代码:public Image filter() { int[] d = new i...。。。
阅读本系列,请先看前言!谢谢 


放大镜与哈哈镜原理上是一样的,我们只要找到相关映射即可。

如这张图所示。不同的映射会有不同的效果,如线性映射会产生放大缩小的感觉,凸函数则会是凸透镜,凹函数就是凹透镜,原则上,不同的函数就不会产生不同的结果

当然对函数也有一定的要求,比如在变化区域的边缘要保持不变。

说完原理,先上放大镜的代码:

public Image filter() {  int[] d = new int[this.img.w*this.img.h]; //must be writed as this.not int[] d = this.img.data;  int cenX = (int)(this.img.w/2);  int cenY = (int)(this.img.h/2);  int therash = this.img.w/6;  for (int y = 0; y < this.img.h ; y++) {            for (int x = 0; x < this.img.w; x++) {             d[x + y * this.img.w] = getRGB(cenX,cenY,x,y,therash);            }        }    this.img.data = d;  return this.img; } private int getRGB(int cenX,int cenY,int x,int y,int therash){  int rgb =0;        int m= 2;//the rate          if(Math.sqrt((cenX-x)*(cenX-x) +(cenY-y)*(cenY-y)) < therash){   int tx = (x - cenX)/m + cenX;   int ty = (y - cenY)/m + cenY;   rgb = this.img.data[tx + ty * this.img.w];  }  else{   rgb = this.img.data[x + y * this.img.w];  }       return rgb; }

哈哈镜的代码:

@Override public Image filter() {  int[] d = new int[this.img.w*this.img.h]; //must be writed as this.not int[] d = this.img.data;  int cenX = (int)(this.img.w/2);  int cenY = (int)(this.img.h/2);  int therash = this.img.w/6;  for (int y = 0; y < this.img.h ; y++) {            for (int x = 0; x < this.img.w; x++) {             d[x + y * this.img.w] = getRGB(cenX,cenY,x,y,therash);            }        }    this.img.data = d;  return this.img; } private int getRGB(int cenX,int cenY,int x,int y,int therash){  int rgb =0;        int m= 2;        int rate = therash/m;  if(Math.sqrt((cenX-x)*(cenX-x) +(cenY-y)*(cenY-y)) < therash){   int tx = (x - cenX)/m ; //此处不同的变换函数会导致不同的效果   int ty = (y - cenY)/m ;   tx  =(int)(tx*getDistance(cenX, cenY, x, y)/rate) + cenX;   ty  =(int)(ty*getDistance(cenX, cenY, x, y)/rate) + cenY;   rgb = this.img.data[tx + ty * this.img.w];  }  else{   rgb = this.img.data[x + y * this.img.w];  }       return rgb; } private double getDistance(int centerX, int centerY, int px, int py) {          double xx = (centerX - px)*(centerX - px);          double yy = (centerY - py)*(centerY - py);          return (int)Math.sqrt(xx + yy);      }

老规矩,上运行结果:

以上

(编辑: epleone)

网友评论
相关文章