**

Java中的实现马赛克效果以及灰度效果-----整张图片

**
实现该效果的思路:

我们知道图片是由一个一个的像素组成的,比如一张图片的分辨率为800 * 800,则它是由800个像素 * 800像素=640000像素组成的。我们要实现马赛克的效果,就是要局部区域像素用一个像素值来替代,换句话说,就是比如局部区域是10像素*10像素,在这些像素中,它们的值是不一样的,现在就像着能不能将该区域中的像素用一个像素的值来进行表示这段局部区域所有的像素值,这样我们就能过实现马赛克的一个效果了。

先来看整体的代码,整体的代码如下:

package com.yf1103;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JFrame;


public class DrawFrame {
	public static void main(String[] args) {
		DrawFrame drawpanel = new DrawFrame();
		drawpanel.showUI();
		
	}
	
	public void showUI() {
		JFrame jf = new JFrame();
		jf.setTitle("图片");
		jf.setSize(500, 500);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setLayout(new FlowLayout());
		jf.setLocationRelativeTo(null);
		
		jf.setVisible(true);
		
		//获取画笔一定要在可见之后
		Graphics g = jf.getGraphics();
		drawpaint(g);
	}
	public void drawpaint(Graphics g) {
		int[][] array = getImagePixel("image/2.png");
		for(int i = 0; i<array.length; i += 10) {
			for(int j = 0; j < array[0].length; j += 10) {
				int pixel = array[i][j];
				Color color = new Color(pixel);
				g.setColor(color);
				g.fillRect(i, j, 10 , 10);
				
			}
		}
		
	}
	
	public int[][] getImagePixel(String path){
		File file = new File(path);
		
		BufferedImage bufferImage = null;
		try {
			bufferImage = ImageIO.read(file);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			
		}
		
		int w = bufferImage.getWidth();
		int h = bufferImage.getHeight();
		
		int [][] pixelArray = new int[w][h];
		
		for(int i = 0; i < w; i++) {
			for(int j = 0; j < h; j++) {
				//读取每个位置的像素点对应的RGB值
				int pixel = bufferImage.getRGB(i, j);
				pixelArray[i][j] = pixel;
			}
		}
		return pixelArray;
		
	}
}

实现的效果:

java zoom 图片 java图片马_java


原图为:

java zoom 图片 java图片马_灰度_02

现在我们来分析这段代码:

首先,我们利用getImagePixel方法,通过传入String类型的path变量,去得到图片上的每一个像素值的RGB的值pixel,然后将值pixel存入一个像素数组pixelArray中去;
然后,利用 drawpaint 方法,通过传入Graphics 类型的 g 变量,也称之为 画笔。利用该方法遍历之前像素数组中的每一个像素,然后将其转换为color 值,然后再设置给画笔,最后填充成一个矩形,这样我们就能够得到整张图片的马赛克效果了。

这里需要提醒的一点:

当我需要改这个马赛克大小的时候,改变下面这张图片的红色圈的地方是不行的,还需要将绿色圈的地方做相应的修改,如果红色圈内和绿色圈的值都改为1,那么输出的就是原图了。该图片如下:

java zoom 图片 java图片马_java zoom 图片_03


灰度效果:

先可以看一段代码(该段代码是基于上述的代码改动一些地方):

java zoom 图片 java图片马_java_04


这段代码主要是较上述的代码改动的地方在于画红色的圈的地方,实现灰度效果的想法是: 利用得到的color对象来分离像素中的r,g,b值,因为这个color对象包含图片中每个像素点的r,g,b值,现在要做的就是去从这个color对象中将r,g,b值分别拿出来,然后再将每个像素的r,g,b值进行求平均值,然后再这个平均值col值设置给画笔,从而就能够实现图像的灰度化。

结果显示为


原图为: