**
Java中实现六种图像处理的效果(灰度化、马赛克效果、去背景实现、珠纹化实现、黑白版画效果、油画效果)
**
本文的编程的思想:
先将实现这六种效果的方法写入一个名为pic_performance的类,然后在监听器类Drawmouse类中通过pic_performance类去创建对象,然后利用该对象去调用里面相应的方法去实现相应的功能即可。
先来看看代码吧。
主类:
package com.yf1111;
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.JButton;
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(1000, 1000);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLayout(new FlowLayout());
jf.setLocationRelativeTo(null);
Drawmouse mouse = new Drawmouse();
String[] name = {"灰度化","马赛克效果","去背景实现", "珠纹化实现", "黑白版画效果", "油画效果"};
for(int i=0;i<name.length;i++){
JButton jbu = new JButton(name[i]);
jf.add(jbu);
jbu.addActionListener(mouse);
}
jf.addMouseListener(mouse);
jf.setVisible(true);
//获取画笔一定要在可见之后
Graphics g = jf.getGraphics();
mouse.gr = g;
}
}
监听器类:
package com.yf1111;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class Drawmouse implements ActionListener, MouseListener {
public String name;
public Graphics gr;
pic_performance p =new pic_performance();
public void actionPerformed(ActionEvent e) {
name = e.getActionCommand();
System.out.println(name+"点击了");
}
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {
if("灰度化".equals(name)) {
p.drawpaint(gr);
}
if("马赛克效果".equals(name)) {
p.mark(gr);
}
if("去背景实现".equals(name)) {
p.decontextualization(gr);
}
if("珠纹化实现".equals(name)) {
p.texture_beading(gr);
}
if("黑白版画效果".equals(name)) {
p.gray(gr);
}
if("油画效果".equals(name)) {
p.painting(gr);
}
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}
实现六种效果的方法类:
package com.yf1111;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Random;
import javax.imageio.ImageIO;
public class pic_performance {
public String path = "image/3.jpg";
//获取图像的像素值
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;
}
//去背景实现
public void decontextualization(Graphics g) {
int[][] img1 = getImagePixel(path);
for(int i=0; i<img1.length; i++) {
for(int j=0; j<img1[0].length; j++) {
Color color = new Color(img1[i][j]);
//去背景,只画高于某一值的颜色,有不同去背景效果
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
if(blue>50) {
Color nc =new Color(red, green, blue);
g.setColor(nc);
g.fillOval(i, j+100, 1, 1);
}
}
}
}
//纹珠化实现
public void texture_beading(Graphics g) {
int[][] img2 = getImagePixel(path);
for(int i=0; i<img2.length; i+=10) {
for(int j=0; j<img2[0].length; j+=10) {
Color color = new Color(img2[i][j]);
//网格化,去掉一种颜色
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
Color nc = new Color(red, green, blue);
g.setColor(nc);
g.fillOval(i, j+100, 8, 8);
}
}
}
//马赛克实现
public void mark(Graphics g) {
int[][] img3 = getImagePixel(path);
for(int i=0; i<img3.length; i+=8) {
for(int j=0; j<img3[0].length; j+=8) {
Color c = new Color(img3[i][j]);
//画方格子,则有马赛克效果
int red = c.getRed();
int green = c.getGreen();
int blue = c.getBlue();
Color nc = new Color(red, green, blue);
g.setColor(nc);
g.fillOval(i, j+100, 8, 8);
}
}
}
//黑白版画效果
public void gray(Graphics g) {
int[][] img4 = getImagePixel(path);
for(int i=0; i<img4.length; i+=2) {
for(int j=0; j<img4[0].length; j+=2) {
Color c = new Color(img4[i][j]);
//大于某个值则画黑,否则白色
int b = c.getBlue();
if(b<100) {
g.setColor(Color.BLACK);
}else {
g.setColor(Color.WHITE);
}
g.fillOval(i, j+100, 4, 4);
}
}
}
//油画效果
public void painting(Graphics g) {
int[][] img5 = getImagePixel(path);
for(int i=0; i<img5.length; i+=5) {
for(int j=0; j<img5[0].length; j+=5) {
Color c =new Color(img5[i][j]);
g.setColor(c);
//填充随机大小的色块
Random ran = new Random();
int r = ran.nextInt(20)+5;
g.fillOval(i, j+100, r, r);
}
}
}
//灰度化
public void drawpaint(Graphics g) {
int[][] array = getImagePixel(path);
for(int i = 0; i<array.length; i += 1) {
for(int j = 0; j < array[0].length; j += 1) {
int pixel = array[i][j];
Color color = new Color(pixel);
int red = color.getRed();
int blue = color.getBlue();
int green = color.getGreen();
int avg = (int)(red + green + blue)/3;
Color col = new Color(avg, avg ,avg);
g.setColor(col);
g.fillRect(i, j+100, 1 , 1);
}
}
}
}
实现的效果为:
1. 灰度化:
2. 马赛克效果:
3. 去背景实现:
4. 珠纹化实现:
5. 黑白版画效果:
6. 油画效果:
7. 原图: