Java中 实现通过文件夹选择任一图像,从而进行图像卷积操作

**

Java中 实现通过文件夹选择任一图像,从而进行图像卷积操作

**
之前的那篇关于图像卷积的博客(Java中实现图像的卷积效果),只是讲了给定一张图片,从而实现图片的卷积操作;而现在,需要去实现通过实现点击窗口上的一个按钮,然后弹出对话框进行图片的选择,选择图片后就能够去实现图像的卷积操作了。

一、效果图为:
在这里插入图片描述
然后:
在这里插入图片描述
最后实现的效果为:

在这里插入图片描述
换一张图片的实现效果为:

在这里插入图片描述
二、实现的代码部分为:

主类:

package com.yf1106;

import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.filechooser.FileNameExtensionFilter;


public class DrawF {
	public static void main(String[] args) {
	    DrawF drawpanel = new DrawF();
		drawpanel.showUI();
		
	}
	
	public void showUI() {
		JFrame jf = new JFrame();
		jf.setTitle("图片");
		jf.setSize(800, 800);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setLayout(new FlowLayout());
		jf.setLocationRelativeTo(null);
		
		
		DrawListener mouse = new DrawListener();
		JButton jub = new JButton("选择文件");
		jf.add(jub);
		jub.addActionListener(mouse);
		
		jf.setVisible(true);
		
		//获取画笔一定要在可见之后
		Graphics g = jf.getGraphics();
		
		
		jf.addMouseListener(mouse);
		mouse.g = g;
		
	}
}

监听器类:

package com.yf1106;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;



public class DrawListener implements MouseListener, ActionListener{
	Graphics g;
	String path;
	File file;
	public int[][] getImagePixel(File file){
		
		BufferedImage bufferImage = null;
		try {
			bufferImage = ImageIO.read(file);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			
		}
		
		int w = bufferImage.getWidth();
		int h = bufferImage.getHeight();
		
		int [][] pixelArray = new int[w][h];
		
		for(int i = 0; i < w; i++) {
			for(int j = 0; j < h; j++) {
				//读取每个位置的像素点对应的RGB值
				int pixel = bufferImage.getRGB(i, j);
				pixelArray[i][j] = pixel;
			}
		}
		return pixelArray;
		
	}
	
	//在界面上画出ia数组图像,即卷积结果
	public void drawjj(Graphics g,File file) {
		int[][] ia = getImagePixel(file);
		ia = valide(ia, kArray);
		for(int i = 0; i<ia.length; i++) {
			for(int j = 0; j<ia[0].length; j++) {
				int pie = ia[i][j];
				Color color = new Color(pie,pie,pie);
				g.setColor(color);
				g.fillRect(i, j, 1, 1);
			}
		}
		
	}
	
	//卷积核
	float[][] kArray = {{-1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1}, {-1, -1, 25, -1, -1}, {-1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1}};
	
	
	//实现卷积操作
	public static int[][] valide(int[][] src, float[][] filter){
		int[][] tem = new int[filter.length][filter[0].length];
		int valideWidth = src[0].length - filter[0].length;
		int valideHeigth = src.length - filter.length + 1;
		int[][] valide = new int[valideHeigth][valideWidth];
		
		for(int i = 0; i<valideHeigth; i++) {
			for(int j = 0; j<valideWidth; j++) {
				for(int y = 0; y<filter.length; y++) {
					for(int z = 0; z<filter[0].length; z++ ) {
						tem[y][z] = (int)((src[i+y][j+z])*filter[y][z]); 
					}
				}
				int kk = 0;
				for(int y = 0; y<filter.length; y++) {
					for(int z = 0; z<filter[0].length; z++) {
						kk += tem[y][z];
					}
				}
				if(kk<0)kk=0;
				if(kk>255)kk=255;
				valide[i][j] = kk;
				
				}
			}
			return valide;
		}
		
	
	public void mouseClicked(MouseEvent e) {
		System.out.println("path = "+path);
		drawjj(g,file);
		
	}
	
	public void mousePressed(MouseEvent e) {}
	
	public void mouseReleased(MouseEvent e) {}
	
	public void mouseEntered(MouseEvent e) {}
	
	public void mouseExited(MouseEvent e) {}
	
	public void actionPerformed(ActionEvent e) {
		JFileChooser chooser = new JFileChooser();
		FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG && GIF Images", "jpg", "png", "gif");
		chooser.setFileFilter(filter);
		int returnVal = chooser.showOpenDialog(null);
		if(returnVal == JFileChooser.APPROVE_OPTION) {
			System.out.println("you chose to open this file: " + chooser.getSelectedFile().getName());
		}
		file = chooser.getSelectedFile();
		
	}
}

三、分析一下关键代码:

说到关键代码,就属于下面这段代码了,如下:
在这里插入图片描述
上述这段代码,可以在Java api 官方文档中找到,直接搜JFileChooser 类就能找到,这段代码就是来自这个类的一段示例代码,如下图:

在这里插入图片描述
这段代码的主要功能,官方文档说的很明白了,就是实现弹出窗体,供我们选择我们本地电脑的文件了。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值