package com.maomy.mainFrame;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.color.ColorSpace;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import com.maomy.utils.SmoothImage;
public class MyImage extends JFrame{
//显示源图像的标签,并将其加入滚动条
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 jme=new JMenu("文件");
JMenuItem []jmit={new JMenuItem("打开图像"),new JMenuItem("清空图像"),new JMenuItem("退出操作"),};
//图像增强
JMenu jm=new JMenu("图像增强");
JMenuItem[]jmi={new JMenuItem("加强边缘"),new JMenuItem("锐化"),new JMenuItem("模糊"),
new JMenuItem("浮雕"),new JMenuItem("灰度变换")};
//图像分割
JMenu jm2=new JMenu("图像分割 ");
JMenuItem[]jmi2={new JMenuItem("边缘检测")};
//图像变换
JMenu jm3=new JMenu("图像变换 ");
JMenuItem[]jmi3={new JMenuItem("图像平滑")};
//图像后退
JMenu jm4=new JMenu("图像后退 ");
JMenuItem[]jmi4={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},
//边缘检测
{0.0f,-1.0f,0.0f,-1.0f,4.f,-1.0f,0.0f,-1.0f,0.0f}
};
//定义一个图标
ImageIcon ii;
public MyImage(){
super("图像处理示例");
this.setBounds(150,100, 1000, 500);
//默认的布局为BorderLayout()
//循环将菜单项添加进图像增强菜单,并为每个菜单项注册动作事件监听器
for(int i=0;i<jmi.length;i++)
{
jm.add(jmi[i]);
if(i<4){
jmi[i].addActionListener(new Handler4());
}
}
jmi[4].addActionListener(new Handler5());//灰度处理
//循环将菜单项添加进图像增强菜单,并为每个菜单项注册动作事件监听器
for(int j=0;j<jmit.length;j++){
jme.add(jmit[j]);
}
jmit[0].addActionListener(new Handler1());//打开
jmit[1].addActionListener(new Handler2());//清空
jmit[2].addActionListener(new Handler3());//退出
//将图像分割菜单加入
jm2.add(jmi2[0]);
// jm2.add(jmi2[1]);
jmi2[0].addActionListener(new Handler6());
//将图像变换菜单加入
jm3.add(jmi3[0]);
jmi3[0].addActionListener(new Handler7());
//后退监听器
jm4.add(jmi4[0]);
jmi4[0].addActionListener(new Handler8());
//将菜单添加进菜单栏,并将菜单栏添加进窗体
jmb.add(jme);
jmb.add(jm);
jmb.add(jm2);
jmb.add(jm3);
jmb.add(jm4);
this.setJMenuBar(jmb);
//将分割窗格添加到窗体中
this.add(jsp);
//关闭动作
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setResizable(true);
}
//*********************************************************
//监听器
//加强边缘,锐化,模糊,浮雕监听器
class Handler4 implements ActionListener{
public void actionPerformed(ActionEvent e) {
if(ii==null||ii.equals("")){
JOptionPane.showMessageDialog(null,"请先打开一幅图片!",
"Alert",JOptionPane.WARNING_MESSAGE);
}
else
for(int i=0;i<4;i++){
if(e.getSource()==jmi[i]){
//获取处理图像的高度和宽度
int width=ii.getImage().getWidth(null);
int height=ii.getImage().getHeight(null);
//创建两个BufferedImage对像分别用来放置待处理和处理后的图像
BufferedImage sb=new BufferedImage(width,height,
BufferedImage.TYPE_INT_ARGB);
BufferedImage tb=new BufferedImage(width,height,
BufferedImage.TYPE_INT_ARGB);
//将待处理图像绘制到源BufferedImage对像图像中
Graphics g=sb.getGraphics();
g.drawImage(ii.getImage(),0,0,Color.WHITE,null);
//注:创建封装卷积矩阵的Kernel对像
Kernel k=new Kernel(3,3,data[i]);
//注:创建对象并卷积处理
ConvolveOp co=new ConvolveOp(k,ConvolveOp.EDGE_NO_OP,null);
co.filter(sb, tb);
//获取处理后的图像并设置到目标标签中
jlt.setIcon(new ImageIcon(tb));
}
}
}
}
/********************************灰度处理方法*******************************
* 获取处理后的图像对应的图标的方法
*
*/
class Handler5 implements ActionListener{
public void actionPerformed(ActionEvent e) {
if(ii==null||ii.equals("")){
JOptionPane.showMessageDialog(null,"请先打开一幅图片!",
"Alert",JOptionPane.WARNING_MESSAGE);
}
else{
//方法返回的是一个imageicon对象
ImageIcon myimage=processGrayImage(ii);
//获取处理后的图像并设置到目标标签中
jlt.setIcon(myimage);
}
}
public ImageIcon processGrayImage(ImageIcon source){
//获取图像的宽度与高度
int width=source.getImage().getWidth(null);
int height=source.getImage().getHeight(null);
//创建表示源图象的BufferedImage对象
BufferedImage sourceBuf=new BufferedImage(
width,height,BufferedImage.TYPE_INT_ARGB);
//创建表示处理后目标图象的BufferedImage对象
BufferedImage targetBuf=new BufferedImage(
width,height,BufferedImage.TYPE_USHORT_GRAY);
//获取表示源图象的BufferedImage对象的画笔
Graphics g=sourceBuf.getGraphics();
//将待处理的图像绘制到源BufferedImage对像中
g.drawImage(source.getImage(),0,0,Color.white,null);
//创建用来进行灰度处理的ColorConvertOp对象
ColorConvertOp cco=new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_sRGB),
ColorSpace.getInstance(ColorSpace.CS_GRAY),null);
//进行灰度处理
cco.filter(sourceBuf,targetBuf);
//返回处理后图像对应的图标对象
return new ImageIcon(targetBuf);
}
}
//打开图像
class Handler1 implements ActionListener{
public void actionPerformed(ActionEvent e) {
//加载选择的图片到图标对象中
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);
}
/*
* 加载选中图片的方法
*
*/
public ImageIcon chooserFile()
{
//弹出文件选择器
int i=jfc.showOpenDialog(null);
//获取选择文件的路径
String dir=(jfc.getSelectedFile()!=null)?(jfc.getSelectedFile().getPath()):null;
if(dir!=null&&!dir.equals(""))
{
//按指定的路径加载图片到图标对象中并返回
return new ImageIcon(dir);
}
return null;
}
}
/******************************边缘检测*************************************
* **********************
* **********************
* **********************
*/
class Handler6 impleme
- 1
- 2
- 3
- 4
- 5
- 6
前往页