时间:2018-09-28

概述:图片模糊 锐化

Java 图像处理的一个例子,实现图片的模糊和锐化,在PhotoShop中,这是一个很常用的滤镜效果,用Java同样也可实现这些强大的功能,图像锐化效果如下图示。

下面是完整的代码:

import java.awt.*;

import java.awt.event.*;

import java.awt.image.*;

import javax.swing.*;

import java.io.*;

// Java图像的模糊与锐化

public class BlurAndSharpenDemo extends JFrame implements ActionListener {

private JPanel jPanel = new JPanel(); //面板jPanel用于容纳模糊、锐化、还原图像按钮

private JButton buttonFile; //打开图像文件按钮

private JButton buttonBlur; //模糊图像按钮

private JButton buttonSharpen; //锐化图像按钮

private JButton buttonReset; //还原图像按钮

ImagePanel imagePanel = new ImagePanel(); //创建ImagePanel对象用于绘制图像

public BlurAndSharpenDemo() {

super("图像的模糊与锐化演示"); //调用父类构造函数

Container contentPane = getContentPane(); //得到容器

buttonFile = new JButton("打开图像文件"); //实例化组件

buttonFile.addActionListener(this); //增加事件监听

buttonBlur = new JButton("模糊图像");

buttonBlur.addActionListener(this);

buttonSharpen = new JButton("锐化图像");

buttonSharpen.addActionListener(this);

buttonReset = new JButton("还原图像");

buttonReset.addActionListener(this);

jPanel.add(buttonBlur); //增加组件到面板上

jPanel.add(buttonSharpen);

jPanel.add(buttonReset);

contentPane.add(jPanel, BorderLayout.SOUTH); //增加组件到容器上

contentPane.add(buttonFile, BorderLayout.NORTH);

contentPane.add(imagePanel, BorderLayout.CENTER);

//设置窗口 www.srcfans.com

this.setSize(280, 230); //设置窗口大小

this.setVisible(true); //设置窗口可见

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时退出程序

}

public void actionPerformed(ActionEvent e) {

JButton button = (JButton)e.getSource(); //获取事件源

//打开图像文件按钮buttonFile事件处理

if(button==this.buttonFile) {

JFileChooser chooser = new JFileChooser(); //实例化文件选择器

chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); //设置文件打开模式为仅打开文件

chooser.setCurrentDirectory(new File(".")); //设置文件选择器当前目录

//设置图像文件过滤器

chooser.setFileFilter(new javax.swing.filechooser.FileFilter() {

public boolean accept(File file) { //可接受的文件类型

String name = file.getName().toLowerCase();

return name.endsWith(".gif")

|| name.endsWith(".jpg")

|| name.endsWith(".jpeg")

|| file.isDirectory();

}

public String getDescription() { //文件描述

return "图像文件";

}

});

int result = chooser.showOpenDialog(this); //显示文件选择对话框

if (result == JFileChooser.APPROVE_OPTION) { //得到用户行为

String fileName = chooser.getSelectedFile().getAbsolutePath();//得到选择的文件名

imagePanel.loadImage(fileName); //截入图像并显示

}

}

//模糊图像按钮buttonBlur事件处理

else if(button==this.buttonBlur) {

imagePanel.blur(); //模糊图像

buttonReset.setEnabled(true); //设置还原图像按钮可用

}

//锐化图像按钮buttonSharpen事件处理

else if(button==this.buttonSharpen) {

imagePanel.sharpen(); //锐化图像

buttonReset.setEnabled(true); //设置还原图像按钮可用

}

//还原图像按钮buttonBlur事件处理

else if(button==this.buttonReset) {

imagePanel.reset(); //还原图像

buttonReset.setEnabled(false); //设置还原图像按钮不可用

}

}

public static void main(String[] args) {

new BlurAndSharpenDemo();

}

public class ImagePanel extends JPanel {

Image image; //被处理的图像

BufferedImage bufImage; //用于显示的缓冲区图像

BufferedImage originalBufImage; //原始缓冲区图像

Graphics2D g2D; //图形环境

//载入图像

public void loadImage(String fileName) {

image = this.getToolkit().getImage(fileName); //获取图像

MediaTracker mt = new MediaTracker(this); //实例化媒体加载器

mt.addImage(image, 0); //增加待加载图像到媒体加载器

try {

mt.waitForAll(); //等待所有图像的加载完成

} catch (Exception ex) {

ex.printStackTrace(); //输出出错信息

}

//创建原始缓冲区图像

originalBufImage = new BufferedImage(image.getWidth(this),image.getHeight(this),BufferedImage.TYPE_INT_ARGB);

g2D = originalBufImage.createGraphics(); //创建缓冲区图像的图形环境

g2D.drawImage(image, 0, 0, this); //传输源图像数据到缓冲区图像中

bufImage = originalBufImage;

repaint(); //重绘组件

}

//过滤图像

public void applyFilter(float[] data) {

if (bufImage == null)

return; //如果bufImage为空则直接返回

Kernel kernel = new Kernel(3, 3, data);

ConvolveOp imageOp=new ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP, null);//创建卷积变换操作对象

BufferedImage filteredBufImage = new BufferedImage(image.getWidth(this),image.getHeight(this),BufferedImage.TYPE_INT_ARGB);//过滤后的缓冲区图像

imageOp.filter(bufImage, filteredBufImage);//过滤图像,目标图像在filteredBufImage

bufImage = filteredBufImage; //让用于显示的缓冲区图像指向过滤后的图像

repaint(); //重绘组件

}

//模糊图像

public void blur() {

if (bufImage == 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 (bufImage == 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 (bufImage == null)

return;

bufImage = originalBufImage; //

g2D.drawImage(image, 0, 0, this);

repaint(); //调用paint()方法重绘组件

}

public void paint(Graphics g) {

super.paintComponent(g);

//如果bufImage非空,则在组件上绘制它

if (bufImage != null) {

Graphics2D g2 = (Graphics2D) g;

g2.drawImage(bufImage,(this.getWidth() - bufImage.getWidth()) / 2,(this.getHeight() - bufImage.getHeight()) / 2,this);

}

}

}

}

java 图像锐化_Java实现图像的模糊与锐化实例相关推荐

  1. java 图片 黑白_java – 将图像转换为黑白(不是灰色标尺)

    你好我将图像从彩色转换为纯黑色和白色,结果是一个黑暗的图像.我没理由.以下是我的代码,它受到SO上其他代码的启发. 任何指导都会有所帮助. BufferedImage coloredImage = I ...

  2. java图片色差_java – JPEG图像的颜色错误

    我现在找到一个解决方案,这是工作,至少如果我的结果图像也是一个JPEG: 首先我读取图像(从字节数组imageData),最重要的是,我还读取元数据. InputStream is = new Buf ...

  3. java jlist 图标_java – 将图像添加到JList项目

    您必须实现 ListCellRenderer(或扩展 DefaultListCellRenderer)并使用getListCellRendererComponent方法返回带有图标的Jlabel. 例 ...

  4. java运行时_java编译时与运行时概念与实例详解

    Java编译时与运行时很重要的概念,但是一直没有明晰,这次专门博客写明白概念. 基础概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只 ...

  5. java对象排序_java对象排序(Comparable)详细实例

    对象实现Comparable接口 package collections.sort.comparable; public class Field implements Comparable{ priv ...

  6. java构造方法重载_Java 重载、重写、构造函数的实例详解

    Java 重载.重写.构造函数的实例详解 方法重写 1.重写只能出现在继承关系之中.当一个类继承它的父类方法时,都有机会重写该父类的方法.一个特例是父类的方法被标识为final.重写的主要优点是能够定 ...

  7. java遍历子目录_Java遍历文件夹及子目录代码实例

    主要逻辑 使用scanner类获取输入的目录,并创建文件对象. 新建一个遍历文件夹的方法,参数是已创建的文件对象,递归调用自己. import java.io.File; public class B ...

  8. java时间戳转换_Java编程实现时间和时间戳相互转换实例

    时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经存在的. 完整的. 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间.使用数字签名技术产生的数据, 签名的对象包括了原始文 ...

  9. java 水印排版_java图片加水印代码 最好有实例!!!先谢了!!

    展开全部 文字水印 import java.awt.*; import java.awt.image.*; import java.io.*; import javax.swing.*; import ...

最新文章

  1. SAP PM (工厂维护)模块介绍 - SAP入门必看
  2. 全球厂商已向自动驾驶投入800亿美元 依然群龙无首 | 厚势
  3. delphi 插入表格HTML代码
  4. 关于不能远程连接Linux中Mysql数据库的问题
  5. [CareerCup] 15.5 Denormalization 逆规范化
  6. 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第十章——自编解析与答案
  7. 2019年查询12年前的往届高考成绩(适用浙江省)
  8. 42.angularJS自定义服务
  9. 类图的使用 c# 1613918428
  10. 【Flink】双亲委派模型与Flink的类加载策略 child-first parent-first
  11. DS4800 用串口登陆0.1改成85状态
  12. 【转】android实现退出整个工程
  13. 「leetcode」1356.根据数字二进制下1的数目排序【如何计算二进制中1的数量】详解!
  14. Pr入门系列之六:使用标记
  15. 计算机桌面空白图标如何删除,我的电脑里有一个空白图标怎么删除
  16. 十大实用网站推荐(1)
  17. 计算机属性中只有远程协助,使用Windows自带的远程协助功能解决电脑问题
  18. 一个公众号绑定多个商户支付
  19. [附源码]Python计算机毕业设计高校社团管理系统Django(程序+LW)
  20. Opencv4学习-2、小案例之绿布抠图-视频背景图替换

热门文章

  1. 数据结构导论c语言实现——顺序表
  2. 多种图像配准方法的综合比较(KAZE、SIFT、SURF等)
  3. Microsoft Excel、Word 或 PowerPoint 文件因文件关联不正确而无法打开
  4. EXCEL数据处理相关操作
  5. 双向长短期记忆网络(BiLSTM)详解
  6. 开源许可证 GPL、BSD、MIT、Mozilla、Apache和LGPL的区别。
  7. 人话解读LGPLv3
  8. 日常学习——记使用POI多线程写Excel数据(续)
  9. 计算机专业学生如何找到一份优质实习?如何进大厂呢?
  10. 【Linux 虚拟机】VMware虚拟机安装Ubuntu系统英文改中文的方法