图片模糊处理的Java 实现

          String str = "2.jpg";
		File f = new File(str);
		try {
			BufferedImage image2 = ImageIO.read(f);
			int w = image2.getWidth();
			int h = image2.getHeight();
			int[] arr = image2.getRGB(0, 0, w, h, null, 0, w);
			int[][] xy = new int[h][w];
			for(int i = 0;i<h;i++) {
				for(int k=0;k<w;k++) {
					xy[i][k] = arr[i*k+k];
				}			
			}
			int th =0;
			int tw =0;
			for(int i = 0;i<h;i++) {
				for(int k=0;k<w;k++) {
					th =i+1;
					tw = k+1;
					if((th == h)) {
						th = h-1;
					}
					if((tw == w)) {
						tw = w-1;
					}
					int temp1 = xy[Math.abs(i-1)][k] -xy[i][k];
					int temp2 = xy[th][k] -xy[i][k];
					int temp3 = xy[i][Math.abs(k-1)] -xy[i][k];
					int temp4 = xy[i][tw] -xy[i][k];
					xy[i][k] =(int)(xy[i][k] + (temp1+temp2+temp3+temp4)/4);
				}
				;
			}
			for(int i = 0;i<h;i++) {
				for(int k=0;k<w;k++) {
					 arr[i*k+k]=xy[i][k] ;
				}			
			}
			
			image2.setRGB(0, 0, w, h, arr, 0, w);
			ImageIO.write(image2, "jpg", new File("22.jpg"));
        

          } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

  

  其原理就是获取图片的像素值,其表示就是int 类型的 一维数组,

       对于图片来说有固定的height 和width ,因此我们将该数组转化为 int [height][width] 的二维数组,我们假设该二维数组表示图像上面的各点值,通过算法 取出该点 上下左右的数值,对其做数学上面的取平均值或者,使用方差等数学方法,我们即可得到新的 二维数组,再将该二维数组转给我们的一维数组,并通过setRGB 方法 将像素值覆写,得到图片。

其前后图片如下: 

 

 

 

 如果要改进模糊效果的话,无非是对像素值的取值算法做数学上面的优化。其原理都是大同小异的

posted @ 2021-02-18 20:49  serviceOBJ  阅读(1061)  评论(0)    收藏  举报