package chapter2;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.color.ColorSpace;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.*;
import java.io.File;

import java.io.IOException;

/**
* Created by LENOVO on 18-1-28.
*/
public class MyFilterUI extends JFrame implements ActionListener{

private static final long serialVersionUID = 1L;
public static final String GRAY_CMD = "灰度";
public static final String BINARY_CMD = "黑白";
public static final String BLUR_CMD = "模糊";
public static final String ZOOM_CMD = "放缩";
public static final String BROWSER_CMD = "请选择...";

private JButton grayBtn;
private JButton binaryBtn;
private JButton blurBtn;
private JButton zoomBtn;
private JButton browserBtn;
private MyFilters filters;

public BufferedImage srcImage;

public MyFilterUI(){
this.setTitle("JAVA 2D BufferedImageOp——滤镜演示");
grayBtn = new JButton(GRAY_CMD);
binaryBtn = new JButton(BINARY_CMD);
blurBtn = new JButton(BLUR_CMD);
zoomBtn = new JButton(ZOOM_CMD);
browserBtn = new JButton(BROWSER_CMD);

//添加组件到面板上
JPanel myPanel = new JPanel();
myPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
myPanel.add(grayBtn);
myPanel.add(binaryBtn);
myPanel.add(blurBtn);
myPanel.add(zoomBtn);
myPanel.add(browserBtn);

filters = new MyFilters();
getContentPane().setLayout(new BorderLayout());
getContentPane().add(filters,BorderLayout.CENTER);
getContentPane().add(myPanel,BorderLayout.SOUTH);

//按钮添加监听事件
setupActionListener();

}
public void setupActionListener(){
grayBtn.addActionListener(this);
binaryBtn.addActionListener(this);
blurBtn.addActionListener(this);
zoomBtn.addActionListener(this);
browserBtn.addActionListener(this);
}
public void setFileTypeFilter(JFileChooser chooser){
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & PNG","jpg","png");
chooser.setFileFilter(filter);
}
@Override
public void actionPerformed(ActionEvent e) {
if(srcImage == null){
JOptionPane.showMessageDialog(this,"请先选择图像源文件!");
try{
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(null);//弹出"打开文件"对话框

File f = chooser.getSelectedFile();//返回所选文件的列表(多个选择)
srcImage = ImageIO.read(f);
if(f !=null){
filters.setSourceImage(srcImage);
filters.repaint();
}
} catch(IOException e1){
e1.printStackTrace();
}

return ;
}
if(GRAY_CMD.equals(e.getActionCommand())){
//filters.doColorGray(srcImage);
filters.setDestImage( filters.doColorGray(srcImage));
filters.repaint();
}else if(BINARY_CMD.equals(e.getActionCommand())){
//filters.doBinaryImage(srcImage);
filters.setDestImage(filters.doBinaryImage(srcImage));
filters.repaint();
}else if(BLUR_CMD.equals(e.getActionCommand())){
//filters.doBlur(srcImage);
filters.setDestImage(filters.doBlur(srcImage));
filters.repaint();
}else if(ZOOM_CMD.equals(e.getActionCommand())){
//filters.doScale(srcImage,1.5,1.5);
filters.setDestImage(filters.doScale(srcImage,1.5,1.5));
filters.repaint();
}else if(BROWSER_CMD.equals(e.getActionCommand())){
try{
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(null);//弹出"打开文件"对话框
File f = chooser.getSelectedFile();//返回所选文件的列表(多个选择)
srcImage = ImageIO.read(f);
if(f != null){
filters.setSourceImage(srcImage);
filters.repaint();
}

} catch(IOException e1){
e1.printStackTrace();
}
}

}
public static void main(String args[]){
MyFilterUI ui = new MyFilterUI();
ui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ui.setPreferredSize(new Dimension(800,600));
ui.pack();
ui.setVisible(true);
}
public static class MyFilters extends JPanel{
public BufferedImage sourceImage;
public BufferedImage destImage;

public BufferedImage getSourceImage() {
return sourceImage;
}

public void setSourceImage(BufferedImage sourceImage) {
this.sourceImage = sourceImage;
}

public BufferedImage getDestImage() {
return destImage;
}

public void setDestImage(BufferedImage destImage) {
this.destImage = destImage;
}

public MyFilters(){
// super();
}
public void paintComponent(Graphics g){
//super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.clearRect(0,0,this.getWidth(),this.getHeight());
if(sourceImage != null){

g2d.drawImage(sourceImage,0,0, sourceImage.getWidth(), sourceImage.getHeight(),null);
if(destImage != null){
g2d.drawImage(destImage,sourceImage.getWidth()+10,0,destImage.getWidth(),
destImage.getHeight(),null);
}

}
//g2d.drawImage(srcImage,0,0, srcImage.getWidth(), srcImage.getHeight(),this);

}

/*实现灰度化
ColorConvertOp主要用于实现各种色彩空间的转换,实现灰度功能时,只需在实例化
ColorConvertOp时指定色彩空间为ColorSpace.CS_GRAY,然后调用它的filter方法返回图像即可。
*/
public BufferedImage doColorGray(BufferedImage bi){
ColorConvertOp filterObj = new ColorConvertOp(
ColorSpace.getInstance(ColorSpace.CS_GRAY),null
);
return filterObj.filter(bi,null);
}
/*实现黑白功能
* LookupOp在实例化时需要传入LookupTable实例,当前实现LookupTable接口的两个实现类为
* ByteLookupTable和ShortLookupTable
* 1)首先将图像灰度化
* 2)针对灰度图像在LookupTable中根据像素值进行索引查找,以便设置新的像素值,从而得到黑白两色图像
*/
public BufferedImage doBinaryImage(BufferedImage bi){
bi = doColorGray(bi);//图像灰度化
byte[] threshold = new byte[256];
for (int i = 0; i<256;i++){
threshold[i] = (byte) ((i<128)? 0:255);
}
BufferedImageOp thresholdOp = new LookupOp(new ByteLookupTable(0,threshold),null);
return thresholdOp.filter(bi,null);
}
/*实现模糊功能
* ConvloveOp是实现模板卷积功能操作的类,通过简单设置卷积核/卷积模板就可以实现图像模糊功能
* 多数情况下图像使用TYPE_3BYTE_BGR存储方式,而BufferedImageOp实现的滤镜不支持操作该存储方式的BufferedImage对像
* 解决方法是首先通过ColorConvertOp把图像从类型TYPE_3BYTE_BGR转换为TYPE_INT_RGB的BufferedImage对象
*/
public BufferedImage convertType(BufferedImage src,int type){
ColorConvertOp cco = new ColorConvertOp(null);
BufferedImage dest = new BufferedImage(src.getWidth(),src.getHeight(),type);
cco.filter(src,dest);
return dest;
}
public BufferedImage doBlur(BufferedImage bi){
if(bi.getType() == BufferedImage.TYPE_3BYTE_BGR){
bi = convertType(bi,BufferedImage.TYPE_INT_RGB);
}
float ninth = 1.0f/9.0f;
float[] blurKernal = {
ninth,ninth,ninth,
ninth,ninth,ninth,
ninth,ninth,ninth
};
BufferedImageOp blurFilter = new ConvolveOp(new Kernel(3,3,blurKernal));
return blurFilter.filter(bi,null);
}

/*实现zoom in/out的功能
* AffineTransformOp支持的操作包括图像的错切、旋转、放缩、平移
* 首先要通过 AffineTransform.getScaleInstance来获取Scale实例,然后作为参数初始化AffineTransformOp实例
*/
public BufferedImage doScale(BufferedImage bi,double sx,double sy){

AffineTransformOp atFilter = new AffineTransformOp(AffineTransform.getScaleInstance(sx,sy),AffineTransformOp.TYPE_BILINEAR);
//计算放缩后图像的宽与高
int nw = (int) (bi.getWidth()*sx);
int nh = (int) (bi.getHeight()*sy);
BufferedImage result = new BufferedImage(nw,nh,BufferedImage.TYPE_3BYTE_BGR);
return atFilter.filter(bi,result);
}
}

}

基于BufferedImage的图像滤镜演示的更多相关文章

  1. Java基于opencv实现图像数字识别(一)

    Java基于opencv实现图像数字识别(一) 最近分到了一个任务,要做数字识别,我分配到的任务是把数字一个个的分开:当时一脸懵逼,直接百度java如何分割图片中的数字,然后就百度到了用Buffere ...

  2. 基于FPGA的图像开发平台 其他摄像头附件说明(OV5642 OV9655)

    基于FPGA的图像开发平台 其他摄像头附件说明 FPGA_VIP_V101 编者 奇迹再现 个人博客 http://www.cnblogs.com/ccjt/ 联系邮箱 Shenyae86@163.c ...

  3. Atitit 常用比较复杂的图像滤镜 attilax大总结

    Atitit 常用比较复杂的图像滤镜 attilax大总结 像素画滤镜 水彩油画滤镜 素描滤镜 梦幻镜 特点是中央集焦,周围景物朦化微带光晕,使人产生如入梦境的感觉.常用于拍摄婚纱.明星照,也用于其它 ...

  4. 基于clahe的图像去雾

    基于clahe的图像去雾     通过阅读一些资料,我了解到clahe算法对图像去雾有所价值,正好opencv中有了实现,拿过来看一看.   但是现在实现的效果还是有所差异 #);    clahe] ...

  5. 笔记:基于DCNN的图像语义分割综述

    写在前面:一篇魏云超博士的综述论文,完整题目为<基于DCNN的图像语义分割综述>,在这里选择性摘抄和理解,以加深自己印象,同时达到对近年来图像语义分割历史学习和了解的目的,博古才能通今!感 ...

  6. 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)

    伴随着毕业论文的完成,这两天终于腾出了空闲,又有时间搞搞FFMPEG的研究了.想着之前一直搞的都是FFMPEG解码方面的工作,很少涉及到FFMPEG编码方面的东西,于是打算研究一下FFMPEG的编码. ...

  7. Java基于opencv实现图像数字识别(五)—投影法分割字符

    Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...

  8. Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

  9. Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

随机推荐

  1. Codeforces 950D A Leapfrog in the Array ( 思维 && 模拟 )

    题意 : 给出 N 表示有标号 1~N 的 N 个数,然后从下标 1 开始将这 N 个数每隔一位放置一个,直到 N 个数被安排完,现在有一个操作就是每次将数列中最右边的数向离其左边最近的空缺处填上,一 ...

  2. ubuntu 安装 tar.gz 文件

    ubuntu 安装 tar.gz 文件 本文链接:https://blog.csdn.net/caloriesung/article/details/81536144 tar zxvf FileNam ...

  3. H5 网站支付宝支付(前端部分)包含微信浏览器中的处理方法。

    手机网站唤起支付宝支付: H5 网站实现支付宝支付是一个很常见的需求: 实现方式主要是在后台配置和预支付, 前端需要做的就是唤起 支付宝App 然后就可以输入密码支付. 这个其实难度很低, 主要就是在 ...

  4. 【转】博弈论——acm

    转自http://blog.csdn.net/lgdblue/article/details/15809893 序:博弈是信息学和数学试题中常会出现的一种类型,算法灵活多变是其最大特点,而其中有一类试 ...

  5. ORA-01034、ORA-27101、ORA-00119错误

    ORA-01034ORA-27101Linux-x86_64 Error: 2:No such file or directory. 或者是 ORA-00119: invalid specificat ...

  6. ZXing使用详解与范例(C#)

    介绍 ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码.(引自百度百科) 用 ...

  7. 在docker容器中调用docker命令

    宿主容器均为CentOS7.6.1810 docker run -it --rm \ -v /usr/bin/docker:/usr/bin/docker \ -v /var/run/docker.s ...

  8. 在windows下使用Mingw搭建模拟Linux

    1.到官网下载最新版Mingw 2.点击安装,最好选择默认路径,如果不是的话,路径中一定不能有空格. 3.选择安装,mingw-developer-toolkit.mingw32-base.mingw ...

  9. Mac上的应用,例如Xcode需要输入原始下载账号才能更新问题

    为了免下载安装Xcode,安装时使用了别人提供的Xcode.dmg安装,或者公司接管上任同事使用的Mac时,上面的应用都是用别人的账号购买下载的,而非使用自己账号在AppStore下载的. 这样的安装 ...

  10. <nginx.conf> nginx设置用户权限

    问题在于,我们使用weblogic在前台系统获取其他系统的文件,然后保存在webloigc目录下,然后配置了nginx来当http服务器,这样,其他的系统可以来下载文件,但是访问的时候提示403错误, ...