【Java开源代码栏目提醒】:网学会员为广大网友收集整理了,Blur.java,希望对大家有所帮助!
package example;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import javax.swing.*;
import java.io.*;
// 图像的模糊与锐化
public class Blur extends JFrame implements ActionListener {
private JPanel jPanel = new JPanel(); // 面板jPanel用于容纳模糊、锐化、还原图像按钮
private JButton buttonBlur; // 模糊图像按钮
private JButton buttonSharpen; // 锐化图像按钮
private JButton buttonReset; // 还原图像按钮
ImagePanel imagePanel = new ImagePanel(); // 创建ImagePanel对象用于绘制图像
public Blur() {
super("图像的模糊与锐化
演示"); // 调用父类构造函数
Container contentPane = getContentPane(); // 得到容器
buttonBlur = new JButton("模糊图像");
buttonBlur.addActionListener(this);
buttonSharpen = new JButton("锐化图像");
buttonSharpen.addActionListener(this);
buttonReset = new JButton("还原图像");
buttonReset.addActionListener(this);
jPanel.add(buttonBlur); // 增加组件到面板上
jPanel.add(buttonSharpen);
jPanel.add(buttonReset);
contentPane.add(jPanel, BorderLayout.SOUTH); // 增加组件到容器上
contentPane.add(imagePanel, BorderLayout.CENTER);
String fileName = "fj.jpg";
imagePanel.loadImage(fileName);
// 设置窗口
this.setSize(280, 230); // 设置窗口大小
this.setVisible(true); // 设置窗口可见
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口时退出
程序 }
public void actionPerformed(ActionEvent e) {
JButton button = (JButton) e.getSource(); // 获取事件源
// 模糊图像按钮buttonBlur事件处理
if (button == this.buttonBlur) {
imagePanel.blur(); // 模糊图像
buttonReset.setEnabled(true); // 设置还原图像按钮可用
}
// 锐化图像按钮buttonSharpen事件处理
else if (button == this.buttonSharpen) {
imagePanel.sharpen(); // 锐化图像
buttonReset.setEnabled(true); // 设置还原图像按钮可用
}
// 还原图像按钮buttonBlur事件处理
else if (button == this.buttonReset) {
imagePanel.reset(); // 还原图像
buttonReset.setEnabled(false); // 设置还原图像按钮不可用
}
}
public static void main(String[] args) {
new Blur();
}
public class ImagePanel extends JPanel {
Image image; // 被处理的图像
BufferedImage bufImage; // 用于显示的缓冲区图像
BufferedImage originalBufImage; // 原始缓冲区图像
Graphics2D g2D; // 图形环境
// 载入图像
public void loadImage(String fileName) {
image = this.getToolkit().getImage(fileName); // 获取图像
MediaTracker mt = new MediaTracker(this); // 实例化媒体加载器
mt.addImage(image, 0); // 增加待加载图像到媒体加载器
try {
mt.waitForAll(); // 等待所有图像的加载完成
} catch (Exception ex) {
ex.printStackTrace(); // 输出出错信息
}
// 创建原始缓冲区图像
originalBufImage = new BufferedImage(image.getWidth(this),
image.getHeight(this), BufferedImage.TYPE_INT_ARGB);
g2D = originalBufImage.createGraphics(); // 创建缓冲区图像的图形环境
g2D.drawImage(image, 0, 0, this); // 传输源图像数据到缓冲区图像中
bufImage = originalBufImage;
repaint(); // 重绘组件
}
// 过滤图像
public void applyFilter(float[] data) {
if (bufImage == null)
return; // 如果bufImage为空则直接返回
Kernel kernel = new Kernel(3, 3, data);
ConvolveOp imageOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP,
null); // 创建卷积变换操作对象
BufferedImage filteredBufImage = new BufferedImage(
image.getWidth(this), image.getHeight(this),
BufferedImage.TYPE_INT_ARGB); // 过滤后的缓冲区图像
imageOp.filter(bufImage, filteredBufImage);// 过滤图像,目标图像在filteredBufImage
bufImage = filteredBufImage; // 让用于显示的缓冲区图像指向过滤后的图像
repaint(); // 重绘组件
}
// 模糊图像
public void blur() {
if (bufImage == null)
return;
float[] data = { 0.0625f, 0.125f, 0.0625f, 0.125f, 0.025f, 0.125f,
0.0625f, 0.125f, 0.0625f };
applyFilter(data);
}
// 锐化图像
public void sharpen() {
if (bufImage == null)
return;
float[] data = { -1.0f, -1.0f, -1.0f, -1.0f, 9.0f, -1.0f, -1.0f,
-1.0f, -1.0f };
applyFilter(data);
}
// 恢复图像
public void reset() {
if (bufImage == null)
return;
bufImage = originalBufImage; //
g2D.drawImage(image, 0, 0, this);
repaint(); // 调用paint()方法重绘组件
}
public void paint(Graphics g) {
super.paintComponent(g);
// 如果bufImage非空,则在组件上