Java实现PS相机从0开始

一、建立界面

二、建立监听器

三、读取图片

四、实现效果

·黑白化效果

·边缘化效果

·浮雕效果

·锐化效果

·镜像效果

·风景叠加效果

·沙画效果

·图片爆炸效果

·图片恢复效果

一、建立界面

建立界面便是建立一个类去继承JFrame类,然后写一个方法去完善界面内容,然后要实现菜单栏效果需要使用JMenuBar菜单条和JMenu菜单和JMenuItem菜单项。

public class DrawUI extends JFrame {

	//创建监听器对象
    DrawListener drawL = new DrawListener();
    DrawListener1 drawL1 = new DrawListener1();
	//显示界面的方法
	public void showUI() {
		//创建一个窗体对象
		JFrame drawFrame = new JFrame();
		drawFrame = this;
		//设置窗体的名字、属性大小、位置、关闭的操作
		drawFrame.setTitle("图像处理");
		drawFrame.setSize(1000, 600);
		drawFrame.setLocationRelativeTo(null);
		drawFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//设置布局为流式布局
		drawFrame.setLayout(new FlowLayout());
		
		// JMenuBar是放菜单的母版,又称为菜单栏
		JMenuBar menuBar = new JMenuBar();
		// 将菜单栏对象放在窗体的菜单栏中
		this.setJMenuBar(menuBar);
				
		//创建第一个文件菜单
		JMenu menu1 = new JMenu("文件");
		menuBar.add(menu1);
		//在文件菜单中增加菜单项				
		String[] arr = {"打开","保存"};
		for(String str :arr){
			JMenuItem menuItem = new JMenuItem(str);
			menu1.add(menuItem);
			menuItem.addActionListener(drawL);
		}
		//设置窗体可见
		drawFrame.setVisible(true);
		//获取Graphics 
		Graphics g = drawFrame.getGraphics();
		//给监听器的属性赋值
		drawL.g = g;
		drawL1.g = g;
}

	//主方法
		public static void main(String[] args) {
			//创建界面对象
			DrawUI ui = new DrawUI();
			//显示界面
			ui.showUI();
			
		}
		

界面加上菜单栏效果图
在这里插入图片描述

二、建立监听器

需要建立一个监听器的类实现ActionListener接口,然后在类里面写需要实现的方法,并改写actionPerformed方法,通过点击菜单栏实现不同效果。

public class DrawListener implements ActionListener {

	Graphics g;
	int rgb = 0;
	BufferedImage img;
	BufferedImage img1;
	BufferedImage img2;
	int data[][];
	int data1[][];
	JFileChooser chooser;
	public void actionPerformed(ActionEvent e) {
		//读取菜单项的文字
		String action = e.getActionCommand();
		switch (action) {
		case "加载":
			load();
			break;
		case "原画":
			draw();
			break;
		}

		

	}

}

三、读取图片

读取图片需要在监听器一开始建立JFileChooser文件选择器对象,通过此类的setFileFilter方法读取图片,然后建立BufferedImage带缓冲的图像类的对象,将图片缓存到缓冲区。

// 读取文件
	public void open() {
		// 指定从桌面打开
		chooser = new JFileChooser(new File("C:\\Users\\11603\\Desktop\\蓝杰"));
		// 文件过滤器
		FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif");
		chooser.setFileFilter(filter);
		// 获取返回值
		int returnVal = chooser.showOpenDialog(null);
		if (returnVal == JFileChooser.APPROVE_OPTION) {
			// 获取选中的文件
			File file = chooser.getSelectedFile();
			System.out.println("You chose to open this file: " + chooser.getSelectedFile());
		}
	}
	
	public void load() {
		//使文件对象等于获取的文件对象
		File file = chooser.getSelectedFile();
		if (file == null) {
			return;
		}
		// 加载图片
		try {
			img = ImageIO.read(file);
			data = new int[img.getWidth()][img.getHeight()];

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

四、实现效果

·黑白化效果

这里到了我们的重中之重,我们知道图像是由一个一个的像素构成的,而像素又是由A(透明度),R(红),G(绿),B(蓝)构成的。因此对一张图片进行处理,实质上是对每一个像素的ARGB进行处理,在这里我们暂且先只对RGB进行处理,当然,有兴趣的同学也可以加上透明度试一试。Color c = new Color(R, G, B, A);这是使用ARGB给颜色赋值的方法,要注意位置,不能写错。注意:R,G,B,A的范围均为0-255,且为整型,不可超出范围。
黑白化效果便是写一个函数,通过取出每个像素点的ARGB,ARGB为16个字节,其中A,R,G,B各占四个字节,然后通过与运算得出R,G,B其中一种,下面以B为例,得出B以后,判断B大于一个值便使画笔颜色为黑,小于一个值便使画笔颜色为白,然后将图像通过画笔画出便得到黑白化的效果。

public void heibai() {
//建立一个缓冲画布、缓冲画笔
		BufferedImage image = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE);
		Graphics e = image.getGraphics();
		//通过两个for循环在画布上用不同颜色画出点
		for (int i = 0; i < img.getWidth(); i++) {
			for (int j = 0;
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值