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

问题描述

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 );elseimage.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(); } }

解决方案

最简单就是改格式引用String format = "jpg"; String format = "png"; ConvolveOp 这个鬼东西,问题多多。我是从来没搞清楚过。另外,推荐http://www.jhlabs.com/ip/index.html这个库,用过,还好。比JDK自己的东西好。

时间: 2024-11-10 01:24:38

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

图像去模糊中的模糊核尺寸的设置问题

问题描述 图像去模糊中的模糊核尺寸的设置问题 最近在看Dilip Krishnan的论文'Blind Deconvolution Using a Normalized Sparsity Measure', 包括其它论文中对模糊核尺寸都需要自己预先设置,请问模糊核的最大尺寸应该如何设置: 还有在论文中,空间不变模糊核的能量函数中的保真项系数(lamda)的设置规则是什么: 希望高手帮忙解答一下!谢谢!

C#用webbrowser在Form中嵌入并且操作Excel表格,如何让他不提示是否保存并取消保存?

excel|web 一.首先简要回顾一下如何操作Excel表             先要添加对Excel的引用.选择项目-〉添加引用-〉COM-〉添加Microsoft   Excel   9.0.(不同的office讲会有不同版本的dll文件).           using   Excel;           using   System.Reflection;                     //产生一个Excel.Application的新进程           Exce

Win7远程操作时提示“远程桌面服务当前正忙”两种解决方法

  Win7远程操作时提示"远程桌面服务当前正忙"两种解决方法           Win7系统远程桌面操作能够实现远程操控电脑,通过远程连接来进行一些控制,可是有些用户在进行远程连接的时候,输入账号密码无法进入,重新进入就会提示"由于远程桌面服务当前正忙,因此无法完成您尝试执行的任务",遇到这个问题该如何解决呢?下面小编给大家两种解决方法. 解决方法一 看一下你电脑任务管理器此项任务是否还在,如果在的话关掉就行了,很多时候是电脑没有反应过来造成的. 解决办法二 原

保存类型-vc++代码,缓存中存储图像像素的数据,如何将其保存成jpg格式的图片

问题描述 vc++代码,缓存中存储图像像素的数据,如何将其保存成jpg格式的图片 是这样的,我通过Matrox采集卡获取到摄像机的模拟图像,通过mil中的函数,可以将其保存成bsq格式的图片(采集卡中自带函数存贮的图像类型byte型,可直接保存成bsq,见下面代码),通过读取存贮内存中的数据,可以得到图片的像素信息了.现在想将buf中的数据保存成jpg格式的,求高手解答. void CCaijiDlg::OnSave() { // TODO: Add your control notificat

软件-Euresys eVision不用图像卡将相机图片直接显示在MFC的对话框界面上

问题描述 Euresys eVision不用图像卡将相机图片直接显示在MFC的对话框界面上 在看Euresys eVision的图像处理软件,想知道不用它的图像卡怎么将相机采集回来的图像显示在界面上,编程环境是vc6.0基于对话框的

word-C# .NET,操作WORD在指定字符串位置插入图片。

问题描述 C# .NET,操作WORD在指定字符串位置插入图片. 我是用这句代码插入的图片: //插入图片 object Anchor = myWord.Application.Selection.Range; bp.Save(bmpPath); myDoc.InlineShapes.AddPicture(bmpPath, ref Nothing, ref Nothing, ref Anchor); Anchor是当前行,我就是想把Anchor变成指定字符串的位置. 或者大神有其他方法也希望能够

Photoshop 润饰图像(十一)模糊过滤

模糊过滤 我们最后一个步骤是使用模糊掩码润饰过滤,它调整边缘细节的对比度以及聚焦良好的错觉. 1.选择 Filter > Sharpen > Unsharp Mask.确保 Preview 选项被选中,以便你在运用前能观看到效果.为更好地观看视图,你可以把鼠标放在预览窗口内拖动以查看图像的不同部位.你也可以用在窗口下面的加.减号按钮来更改预览图像的缩放比例. 2.拖动数字滑杆直到图像如你希望一样地锐化(这里我们使用120%).然后单击 OK 接受模糊过滤.

图像编程学习笔记9——图像的锐化

锐化(sharpening)和平滑恰恰相反,它是通过增强高频分量来减少图象中的模糊,因此又称为高通滤波(high passfilter).锐化处理在增强图象边缘的同时增加了图象的噪声. 常用的锐化模板是拉普拉斯(Laplacian)模板(见(3.4)式),又是个数学家的名字,可见学好数学,走遍天下都不怕.   (3.4) 容易看出拉普拉斯模板的作法:先将自身与周围的8个象素相减,表示自身与周围象素的差别:再将这个差别加上自身作为新象素的灰度.可见,如果一片暗区出现了一个亮点,那么锐化处理的结果是

对图像的直方图进行变换操作

前言 图像增强处理技术一直是图像处理领域一类非常重要的基本图像处理技术.通过采取适当的增强处理可以使原本模糊不清甚至根本无法分辨的原始图片处理成清楚.明晰的富含大量有用信息的可使用目标图像,因此此类图像处理技术在医学.遥感.微生物.刑侦以及军事等诸多科研和应用领域对原始图像的模式识别.目标检测等起着重要作用.本文将从空间域的角度对图像的灰度直方图增强处理方法做详细的介绍. 图像的灰度直方图处理技术 在空域对图像进行增强处理的方式有许多种,如增强对比度和动态范围压缩等等,但这些处理方式都是针对原始