0 0

对图像进行锐化和模糊操作之后保存到桌面,保存的图片和显示的不一样5

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();
    }
   
}
2013年4月25日 20:08
  • 大小: 97.3 KB

1个答案 按时间排序 按投票排序

0 0

采纳的答案

最简单就是改格式

引用
String format = "jpg";

String format = "png";

ConvolveOp 这个鬼东西,问题多多。
我是从来没搞清楚过。

另外,推荐
http://www.jhlabs.com/ip/index.html
这个库,用过,还好。
比JDK自己的东西好。

2013年4月26日 08:29

相关推荐

    \利用laplacian算子对图像进行锐化操作

    本文将深入探讨如何利用拉普拉斯算子对图像进行锐化操作。 一、拉普拉斯算子简介 拉普拉斯算子是一个在二维或三维空间中的二阶微分算子,通常表示为Δ或∇²。在二维图像处理中,它是一个3x3的差分矩阵,用于检测...

    数字图像处理 kernal算子对图像进行锐化和模糊

    数字图像处理中kernal算子对图像进行锐化和模糊详细算法9865

    Java图片锐化和模糊特效的实现.rar

    在Java编程语言中,我们可以利用图像处理库,如Java AWT和Swing,来实现对图像的各种操作,包括锐化和模糊特效。本项目提供的"Java图片锐化和模糊特效的实现.rar"就是一个实例,展示了如何模拟Photoshop滤镜功能。...

    java 锐化和模糊图像

    在图像处理领域,锐化和模糊是两种基本的图像滤波技术,主要用于改变图像的视觉效果。在Java中,我们可以利用各种图像处理库,如Java AWT和Swing,或者第三方库如Java ImageIO和OpenCV,来实现这些功能。本文将深入...

    C#实现各种图像模糊、锐化、色彩增强

    在这个主题中,我们将探讨如何使用C#实现图像的模糊、锐化和色彩增强。这些技术是图像处理中的基本操作,对于改善图像质量、突出关键细节或进行艺术创作都有重要作用。 1. **图像模糊**: - **高斯滤波**:这是一...

    数字图像处理图像锐化C++实现

    在数字图像处理领域,图像锐化是一种常见的技术,用于增强图像的边缘和细节,使得图像看起来更加清晰。本文将深入探讨图像锐化的概念、常见算法以及如何使用C++进行实现。 图像锐化的目标是增强图像的高频成分,即...

    Java实现图像模糊、锐化

    在图像处理领域,模糊和锐化是两种常见的操作,它们可以改变图像的视觉效果,增强或减弱细节。本文将深入探讨如何使用Java语言来实现这两种技术,并提供相关的代码示例和实际应用图片。 首先,我们要了解模糊和锐化...

    MATLAB实现图像锐化

    MATLAB中的`imgradient`函数可以计算图像的x和y方向的梯度,然后通过对这些梯度值进行绝对值操作和求和,得到一个表示边缘强度的图像。 例如,我们可以使用以下步骤实现基于梯度的锐化: 1. 加载图像。 2. 计算...

    图像处理实验报告-图像锐化.pdf

    数字图像处理中图像锐化应从水平和垂直两个方向进行,最后的锐化结果由水平和垂直锐化结果共同得到,锐化结果一方面是模糊的图像变得清晰了,另一方面提取了目标物体的边界,对图像进行分割。锐化的图像质量有所改变...

    应用拉普拉斯算子对图像实施空域高通滤波,以锐化图像

    最后,对图像进行了刷新,以显示锐化后的图像。 应用拉普拉斯算子对图像实施空域高通滤波,以锐化图像是数字图像处理技术中的一个重要应用。该方法可以用来检测图像中的边缘和轮廓,并对图像进行锐化,以增强图像的...

    彩色图像平滑和锐化的实现

    对于描述中提到的"imageLane.bmp"图像,我们首先会将其加载到程序(可能是MATLAB环境,因为文件名imageLane.m可能暗示这是一个MATLAB脚本),然后分别在RGB和HIS模型下进行平滑和锐化处理。平滑可能通过应用高斯...

    数字图像锐化

     非线性锐化滤波就是使用微分对图像进行处理,以此来锐化由于邻域平均导致的模糊图像。图像处理中最常用的微分是利用图y像沿某个方向上的灰度变化率,即原图像函数的梯度。梯度定义如下:  (公式2.1)  梯度模的...

    VC++图像锐化和边缘检测

    在图像处理领域,锐化和边缘检测是两个关键的技术,用于增强图像的细节和识别图像中的边界。在本文中,我们将深入探讨使用VC++实现这些技术的原理与方法,包括微分运算、梯度锐化算子、Roberts边缘检测、Sobel边缘...

    Java 图像的模糊与锐化 源码

    在Java编程语言中,处理图像是一项常见的任务,其中包括对图像进行模糊和锐化的操作。这两个概念是图像处理中的基本操作,常用于图像增强、去噪或突出特定图像特征。本篇将详细介绍Java实现图像模糊与锐化的技术及其...

    imageintensify.rar_MATLAB掩膜_图像锐化_掩膜_掩膜图像_锐化掩膜法

    在图像处理领域,图像增强是一种常见的技术,用于改善图像的质量,...这不仅涉及到图像处理的基础理论,如多分辨率分析和掩模操作,还涉及到MATLAB编程技巧,对于学习和研究图像增强技术的人员来说是非常有价值的资源。

    c#,halcon 图像锐化例程

    在本例程中,我们将探讨如何使用C#编程语言与Halcon机器视觉库进行图像锐化操作。Halcon是德国MVTec公司开发的一个功能强大的机器视觉软件,提供了丰富的图像处理函数。 首先,我们需要理解C#的基础知识。C#是一种...

    java 图像处理(模糊处理、锐化处理)

    本教程将探讨两个关键的图像处理技术:模糊处理和锐化处理。这些技术在图像分析、图像增强以及艺术创作中有着广泛的应用。 模糊处理是降低图像清晰度的过程,通常用于减少图像中的噪声或创建柔和的效果。在Java中,...

    Java实现图像的模糊与锐化_java_

    Java实现图像的模糊与锐化,实现类似于Photoshop中的模糊与锐化的效果

Global site tag (gtag.js) - Google Analytics