sample29_8.java
来自「Java SE 6.0前27-31章示的示例代码,简单易学」· Java 代码 · 共 128 行
JAVA
128 行
package wyf.jc;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;
import java.awt.color.*;
import java.io.*;
public class Sample29_8 extends JFrame implements ActionListener
{
//创建显示源图像的标签,并将其放置到滚动窗格中
JLabel jls=new JLabel();
JScrollPane jspz=new JScrollPane(jls);
//创建显示目标图像的标签,并将其放置到滚动窗格中
JLabel jlt=new JLabel();
JScrollPane jspy=new JScrollPane(jlt);
//创建分割窗格,并设置各子窗格中显示的控件
JSplitPane jsp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jspz,jspy);
//创建文件选择器
JFileChooser jfc=new JFileChooser("d:\\");
//创建菜单栏、菜单以及菜单项
JMenuBar jmb=new JMenuBar();
JMenu jm=new JMenu("卷积滤镜处理");
JMenuItem[] jmi={new JMenuItem("加强边缘"),new JMenuItem("锐化"),
new JMenuItem("模糊"),new JMenuItem("浮雕")};
//创建表示不同滤镜的卷积矩阵数组
float[][] data =
{
//加强边缘
{0f,-1f,0f,
-1f,5f,-1f,
0f,-1f,0f},
//锐化
{-0.125f,-0.125f,-0.125f,
-0.125f,2f,-0.125f,
-0.125f,-0.125f,-0.125f},
//模糊
{0.09375f,0.09375f,0.09375f,
0.09375f,0.25f,0.09375f,
0.09375f,0.09375f,0.09375f},
//浮雕
{2f,0f,2f,
0f,0f,0f,
2f,0f,-5f}
};
//定义一个图标引用
ImageIcon ii;
public Sample29_8()
{
//加载选择的图片到图标对象中
ii=this.chooserFile();
//将图片设置到源标签中
jls.setIcon(ii);
//设置两个标签的水平、垂直对齐方式
jls.setVerticalAlignment(JLabel.CENTER);
jls.setHorizontalAlignment(JLabel.CENTER);
jlt.setVerticalAlignment(JLabel.CENTER);
jlt.setHorizontalAlignment(JLabel.CENTER);
//将处理后的图片设置到目标标签中
jlt.setIcon(ii);
//设置分隔条的宽度以及初始位置
jsp.setDividerLocation(500);
jsp.setDividerSize(4);
//将分割窗格添加到窗体中
this.add(jsp);
//循环将菜单项添加进菜单,并为每个菜单项注册动作事件监听器
for(int i=0;i<jmi.length;i++)
{
jm.add(jmi[i]);
jmi[i].addActionListener(this);
}
//将菜单添加进菜单栏,并将菜单栏添加进窗体
jmb.add(jm);
this.setJMenuBar(jmb);
//设置窗体的标题、大小位置以及可见性
this.setTitle("卷积滤镜处理示例");
this.setBounds(0,0,1000,500);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//实现ActionListener接口中的事件处理方法
public void actionPerformed(ActionEvent e)
{
for(int i=0;i<jmi.length;i++)
{
if(e.getSource()==jmi[i])
{//对事件源进行判断,决定使用哪一种卷积矩阵进行处理
//获取待处理图像的宽度与高度
int width=ii.getImage().getWidth(null);
int height=ii.getImage().getHeight(null);
//创建两个BufferedImage对象分别用来放置待处理图像与处理后的图像
BufferedImage sourceBuf=
new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
BufferedImage targetBuf=
new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
//将待处理图像绘制加载到源BufferedImage对像中
Graphics g=sourceBuf.getGraphics();
g.drawImage(ii.getImage(),0,0,Color.white,null);
//创建封装卷积矩阵的Kernel对象
Kernel kernel = new Kernel(3,3,data[i]);
//创建ConvolveOp对象并进行卷积处理
ConvolveOp co = new ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP,null);
co.filter(sourceBuf,targetBuf);
//获取处理后的图像并设置到目标标签中
jlt.setIcon(new ImageIcon(targetBuf));
}
}
}
//加载选中图片的方法
public ImageIcon chooserFile()
{
//弹出文件选择器
int i=jfc.showOpenDialog(this);
//获取选择文件的路径
String dir=(jfc.getSelectedFile()!=null)?(jfc.getSelectedFile().getPath()):null;
if(dir!=null&&!dir.equals(""))
{
//按指定的路径加载图片到图标对象中并返回
return new ImageIcon(dir);
}
return null;
}
public static void main(String[] args)
{
//创建Sample29_8窗体对象
new Sample29_8();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?