import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileSystemView;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
/*
* 图片编辑器
*/
public class PicEdit extends JFrame {
private int currentPixArray[] = null;// 保存当前操作的像素矩阵
BufferedImage bufImage = null; //用于显示的缓冲区图像
BufferedImage originalBufImage; //原始缓冲区图像
private String lastDir = "";// 图像的路径
private JLabel imageLabel = null;// 用于显示图像的标签
private BufferedImage newImage;// 加载的图像
private int h, w;// 图像的高和宽
private LinkedList<int[]> imageStack = new LinkedList<int[]>();// 保存历史操作图像矩阵
private LinkedList<int[]> tempImageStack = new LinkedList<int[]>();
public PicEdit() {
super("图片特效工具");
// 创建菜单
JToolBar toolBar = new JToolBar();
this.add(toolBar,BorderLayout.NORTH);
//skin sk = new skin();
JButton openbutton = new JButton(new ImageIcon("sk.getAddpic()"));
//JButton exitbutton = new JButton(new ImageIcon("sk.getExit()"));
//JButton graybutton = new JButton(new ImageIcon("sk.getGray()"));
//JButton balancebutton = new JButton(new ImageIcon("sk.getBalance()"));
JButton blurbutton = new JButton(new ImageIcon("sk.getBlur()"));
JButton sharpenbutton = new JButton(new ImageIcon("sk.getSharpen()"));
JButton resetbutton = new JButton(new ImageIcon("sk.getReset()"));
JButton backbutton = new JButton(new ImageIcon("sk.getPrevious()"));
JButton frontbutton = new JButton(new ImageIcon("sk.getNext()"));
//JButton waterbutton = new JButton(new ImageIcon("sk.getWater()"));
//JButton spotlightbutton = new JButton(new ImageIcon("sk.getSpotlight()"));
//JButton bitbltbutton = new JButton(new ImageIcon("sk.getBiblt()"));
//JButton printscbutton = new JButton(new ImageIcon("sk.getPrintsc()"));
JButton savebutton = new JButton(new ImageIcon("sk.getSave()"));
openbutton.setToolTipText("打开文件");
openbutton.setText("打开文件");
openbutton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);//让文字置于图标
openbutton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);//下方
openbutton.addActionListener(new OpenListener());
blurbutton.setToolTipText("模糊");
blurbutton.setText("模糊");
blurbutton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
blurbutton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
blurbutton.addActionListener(new BlurActionListener());
sharpenbutton.setToolTipText("锐化");
sharpenbutton.setText("锐化");
sharpenbutton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
sharpenbutton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
sharpenbutton.addActionListener(new SharpenActionListener());
resetbutton.setToolTipText("还原");
resetbutton.setText("还原");
resetbutton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
resetbutton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
resetbutton.addActionListener(new ResetMenuItemActionListener());
backbutton.setToolTipText("后退");
backbutton.setText("后退");
backbutton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
backbutton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
backbutton.addActionListener(new BackActionListener());
frontbutton.setToolTipText("前进");
frontbutton.setText("前进");
frontbutton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
frontbutton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
frontbutton.addActionListener(new FrontActionListener());
savebutton.setToolTipText("保存图片到桌面");
savebutton.setText("保存");
savebutton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
savebutton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
savebutton.addActionListener(new SaveListener());
toolBar.add(openbutton);
toolBar.add(blurbutton);
toolBar.add(sharpenbutton);
toolBar.add(backbutton);
toolBar.add(frontbutton);
toolBar.add(resetbutton);
toolBar.add(savebutton);
this.setSize(1200,700);
this.setLocation(20,20);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
imageLabel = new JLabel("");
JScrollPane pane = new JScrollPane(imageLabel);
this.add(pane, BorderLayout.CENTER);
this.setVisible(true);
}
//-----------------菜单监听器---------------//
private class OpenListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
FileDialog d = new FileDialog(PicEdit.this,"Open image file",FileDialog.LOAD);
d.setFile(".jpg");
d.setDirectory(lastDir);
d.setVisible(true);
String file = d.getFile();
lastDir = d.getDirectory();
if(file!=null)
{
try {
newImage = ImageIO.read(new File(lastDir+file));
originalBufImage = newImage;
w = newImage.getWidth();
h = newImage.getHeight();
currentPixArray = getPixArray(newImage, w, h);
imageStack.clear();
tempImageStack.clear();
imageStack.addLast(currentPixArray);
imageLabel.setIcon(new ImageIcon(newImage));
} catch (IOException ex) {
System.out.println(ex);
}
}
PicEdit.this.repaint();
}
}
private class BackActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (imageStack.size() <= 1) {
JOptionPane.showMessageDialog(null, "此幅图片的处理已经没有后退历史操作了", "提示",
JOptionPane.INFORMATION_MESSAGE);
} else {
tempImageStack.addLast(imageStack.removeLast());
currentPixArray = imageStack.getLast();
showImage(currentPixArray);
PicEdit.this.setRGB(newImage,0,0,w,h,currentPixArray);//将变换后的结果保存到newImage里
}
}
}
private class FrontActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (tempImageStack.size() < 1) {
JOptionPane.showMessageDialog(null, "此幅图片的处理已经没有前进历史操作了", "提示",
JOptionPane.INFORMATION_MESSAGE);
} else {
currentPixArray = tempImageStack.removeFirst();
imageStack.addLast(currentPixArray);
showImage(currentPixArray);
PicEdit.this.setRGB(newImage,0,0,w,h,currentPixArray);
}
}
}
private class BlurActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
PicEdit.this.blur();
}
}
private class SharpenActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
PicEdit.this.sharpen();
}
}
private class ResetMenuItemActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
PicEdit.this.reset();
}
}
private class SaveListener implements ActionListener{
public void actionPerformed(ActionEvent e){
save();
}
}
//-----------------过滤图像---------------//
public void applyFilter(float[] data) {
if (newImage == null)
return; //如果newImage为空则直接返回
Kernel kernel = new Kernel(3, 3, data);
ConvolveOp imageOp=new ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP, null); //创建卷积变换操作对象
BufferedImage filteredBufImage = new BufferedImage(newImage.getWidth(PicEdit.this),newImage.getHeight(PicEdit.this),BufferedImage.TYPE_INT_ARGB); //过滤后的缓冲区图像
imageOp.filter(newImage, filteredBufImage);//过滤图像,目标图像在filteredBufImage
newImage = filteredBufImage; //让用于显示的缓冲区图像指向过滤后的图像
int[] resultArray = getPixArray(newImage, w, h);
imageStack.addLast(resultArray);
currentPixArray = resultArray;
showImage(resultArray);
tempImageStack.clear();
PicEdit.this.setRGB(newImage,0,0,w,h,resultArray);
}
//-----------------模糊图像---------------//
public void blur() {
if (newImage == 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 (newImage == 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 (newImage == null)
return;
int[] resultArray = imageStack.getFirst();
imageStack.addLast(resultArray);
currentPixArray = resultArray;
showImage(resultArray);
tempImageStack.clear();
PicEdit.this.setRGB(newImage,0,0,w,h,resultArray);
}
//-----------------获取图像像素矩阵---------------//
private int[] getPixArray(Image im, int w, int h) {
int[] pix = new int[w * h];
PixelGrabber pg = null;
try {
pg = new PixelGrabber(im, 0, 0, w, h, pix, 0, w);
if (pg.grabPixels() != true)
try {
throw new java.awt.AWTException("pg error" + pg.status());
} catch (Exception eq) {
eq.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
}
return pix;
}
//-----------------显示图片---------------//
private void showImage(int[] srcPixArray) {
Image pic = createImage(new MemoryImageSource(w, h, srcPixArray, 0, w));
ImageIcon ic = new ImageIcon(pic);
imageLabel.setIcon(ic);
imageLabel.repaint();
}
//-----------------将图像数组转变成BufferedImage图像---------------//
public void setRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {
int type = image.getType();
if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
image.getRaster().setDataElements( x, y, width, height, pixels );
else
image.setRGB( x, y, width, height, pixels, 0, width );
}
//-----------------保存图像到桌面---------------//
public void save(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddHHmmss");
String name = sdf.format(new Date());
File path = FileSystemView.getFileSystemView().getHomeDirectory();
String format = "jpg";
File f = new File(path + File.separator + name + "." + format);
try {
ImageIO.write(newImage, format, f);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args){
new PicEdit();
}
}
相关推荐
本文将深入探讨如何利用拉普拉斯算子对图像进行锐化操作。 一、拉普拉斯算子简介 拉普拉斯算子是一个在二维或三维空间中的二阶微分算子,通常表示为Δ或∇²。在二维图像处理中,它是一个3x3的差分矩阵,用于检测...
数字图像处理中kernal算子对图像进行锐化和模糊详细算法9865
在Java编程语言中,我们可以利用图像处理库,如Java AWT和Swing,来实现对图像的各种操作,包括锐化和模糊特效。本项目提供的"Java图片锐化和模糊特效的实现.rar"就是一个实例,展示了如何模拟Photoshop滤镜功能。...
在图像处理领域,锐化和模糊是两种基本的图像滤波技术,主要用于改变图像的视觉效果。在Java中,我们可以利用各种图像处理库,如Java AWT和Swing,或者第三方库如Java ImageIO和OpenCV,来实现这些功能。本文将深入...
在这个主题中,我们将探讨如何使用C#实现图像的模糊、锐化和色彩增强。这些技术是图像处理中的基本操作,对于改善图像质量、突出关键细节或进行艺术创作都有重要作用。 1. **图像模糊**: - **高斯滤波**:这是一...
在数字图像处理领域,图像锐化是一种常见的技术,用于增强图像的边缘和细节,使得图像看起来更加清晰。本文将深入探讨图像锐化的概念、常见算法以及如何使用C++进行实现。 图像锐化的目标是增强图像的高频成分,即...
在图像处理领域,模糊和锐化是两种常见的操作,它们可以改变图像的视觉效果,增强或减弱细节。本文将深入探讨如何使用Java语言来实现这两种技术,并提供相关的代码示例和实际应用图片。 首先,我们要了解模糊和锐化...
MATLAB中的`imgradient`函数可以计算图像的x和y方向的梯度,然后通过对这些梯度值进行绝对值操作和求和,得到一个表示边缘强度的图像。 例如,我们可以使用以下步骤实现基于梯度的锐化: 1. 加载图像。 2. 计算...
数字图像处理中图像锐化应从水平和垂直两个方向进行,最后的锐化结果由水平和垂直锐化结果共同得到,锐化结果一方面是模糊的图像变得清晰了,另一方面提取了目标物体的边界,对图像进行分割。锐化的图像质量有所改变...
最后,对图像进行了刷新,以显示锐化后的图像。 应用拉普拉斯算子对图像实施空域高通滤波,以锐化图像是数字图像处理技术中的一个重要应用。该方法可以用来检测图像中的边缘和轮廓,并对图像进行锐化,以增强图像的...
对于描述中提到的"imageLane.bmp"图像,我们首先会将其加载到程序(可能是MATLAB环境,因为文件名imageLane.m可能暗示这是一个MATLAB脚本),然后分别在RGB和HIS模型下进行平滑和锐化处理。平滑可能通过应用高斯...
非线性锐化滤波就是使用微分对图像进行处理,以此来锐化由于邻域平均导致的模糊图像。图像处理中最常用的微分是利用图y像沿某个方向上的灰度变化率,即原图像函数的梯度。梯度定义如下: (公式2.1) 梯度模的...
在图像处理领域,锐化和边缘检测是两个关键的技术,用于增强图像的细节和识别图像中的边界。在本文中,我们将深入探讨使用VC++实现这些技术的原理与方法,包括微分运算、梯度锐化算子、Roberts边缘检测、Sobel边缘...
在Java编程语言中,处理图像是一项常见的任务,其中包括对图像进行模糊和锐化的操作。这两个概念是图像处理中的基本操作,常用于图像增强、去噪或突出特定图像特征。本篇将详细介绍Java实现图像模糊与锐化的技术及其...
在图像处理领域,图像增强是一种常见的技术,用于改善图像的质量,...这不仅涉及到图像处理的基础理论,如多分辨率分析和掩模操作,还涉及到MATLAB编程技巧,对于学习和研究图像增强技术的人员来说是非常有价值的资源。
在本例程中,我们将探讨如何使用C#编程语言与Halcon机器视觉库进行图像锐化操作。Halcon是德国MVTec公司开发的一个功能强大的机器视觉软件,提供了丰富的图像处理函数。 首先,我们需要理解C#的基础知识。C#是一种...
本教程将探讨两个关键的图像处理技术:模糊处理和锐化处理。这些技术在图像分析、图像增强以及艺术创作中有着广泛的应用。 模糊处理是降低图像清晰度的过程,通常用于减少图像中的噪声或创建柔和的效果。在Java中,...
Java实现图像的模糊与锐化,实现类似于Photoshop中的模糊与锐化的效果