1、理论

1、Java中的画图是一个非常有意思且非常重要的知识,学会了能在开发中得到意想不到的效果
2、但是,贯彻整个java体系的,并不是画图知识,而是流体系,可以这么说,流体系就像一个通道一样,连接着程序中所需要的,是程序的血管所在。
3、事件的响应,在Swing编程里,可以说,如果你想让程序变得功能强大,事件的响应就是不可缺少的部分。

2、思想+代码实现

一、 思路

通过BufferedImage类来接收导入程序内的图片,其次就是获得该图片的画笔,通过监听窗口鼠标的事件来完成图片的绘画,最后得到图片的缓存字节流来实现将图片从程序中写出到硬盘中。

二、实现

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.*;public class Text extends JFrame{private static BufferedImage image=null;//接收图片的缓存对象private static Graphics mainGraphics=null,graphics=null;//得到主面板的画笔和图片的画笔private static Container panel=null;//得到面板对象private static ByteArrayOutputStream outputStream=null;//字节缓冲流对象public static void main(String[] args) {Text window=new Text();}/**
*   通过构造方法完成窗口的初始化
*/public Text(){this.setSize(400,400);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);panel=this.getContentPane();this.setVisible(true);readImage();this.addMouseListener(new MouseListen());this.addWindowListener(new WindowListen());mainGraphics=panel.getGraphics();//得到面板的画笔print(mainGraphics);//绘图方法}//将图片从指定的路径中读入程序//如果成功就返回真,否则就报错并且结束程序private static boolean readImage(){File file=new File("1.jpg");try {image= ImageIO.read(file);} catch (IOException e) {e.printStackTrace();return false;}return true;}//实现对图片的绘画private static void drawImage(int x,int y){graphics=image.getGraphics();//得到图片的画笔graphics.setFont(new Font("华文财运",0,50));//设置画笔的样式graphics.setColor(Color.RED);//设置画笔的颜色graphics.drawString("风轻仰",x,y);//设置画笔在响应事件的时候画的是什么mainGraphics.drawImage(image,0,0,null);//最后通过主面板的画笔将绘画后的图片显示在出窗口中}@Overridepublic void print(Graphics g) {//通过重写SWING中的绘画方法来调用自定义的图片绘画方法g.drawImage(image,0,0,null);}//通过定义一个私有的内部类完成鼠标的监听private class MouseListen extends MouseAdapter{@Overridepublic void mouseClicked(MouseEvent e) {print(mainGraphics);//每次绘画都重绘图片drawImage(e.getX(),e.getY());//将鼠标的X、Y坐标作为参数传给绘画方法}}//通过定义一个私有的内部类完成窗口的监听(主要是对关闭时做操作)//作用是:在窗口关闭的时候将图片从程序中写出private static class WindowListen extends WindowAdapter {//实现窗口关闭时的事件@Overridepublic void windowClosing(WindowEvent e) {outputStream=new ByteArrayOutputStream();//初始化缓冲字节流对象try {ImageIO.write(image,"JPEG",outputStream);//将字节流进行后缀的修饰,并将图片放入字节流中} catch (IOException ioException) {ioException.printStackTrace();}byte[] content=outputStream.toByteArray();//得到字节流中的所有字节writeImage(content);//写出的方法}//将图片写出到计算机指定的位置private void writeImage(byte[] content){try(BufferedOutputStream inputStream=new BufferedOutputStream(new FileOutputStream("E:\\1.jpg"))){//将所传过来的字节流中的字节设置为输出流inputStream.write(content);//将字节写出到指定位置} catch (Exception e) {e.printStackTrace();}}}
}

3、运行结果

1、开始运行时将图片导入

2、开始画(本案例以在图片上加上水印为演示,其他情况都大同小异)

3、在编辑好后,关闭窗口就会将图片保存在指定的位置,可以使用电脑中的图片查看软件打开查看

4、总结

1、ByteArrayOutputStream类:是字节数组流,输入OutputStream接口的实现类
其中最常用的方法就是:
ImageIO.read():从指定的位置将图片读入内存
ImageIO.write():第一个参数是图片对象,第二个参数是一个字符串,表示要转换的格式,最后一个参数是输入流,将指定的图片写入输出流中

2、ImageIO 类:是一个非常常用的图片工具类,内部封装类很多对图片的操作方法。

学程序切记不可眼高手低,理论知识只是程序的一个骨架,程序的外貌,终究还是要通过代码来实现,而一个完美的程序就像自己在重新创造一个满意的自己一样,需要考虑自己想要的一切。
程序的真正意义就是:解决生活中的需求。

Java Swing编程中对图片的编辑相关推荐

  1. JTable是Swing编程中很常用的控件

    JTable是Swing编程中很常用的控件,这里总结了一些常用方法以备查阅. 一.创建表格控件的各种方式: 1) 调用无参构造函数. JTable table = new JTable(); 2) 以 ...

  2. JUC里面的相关分类|| java并发编程中,关于锁的实现方式有两种synchronized ,Lock || Lock——ReentrantLock||AQS(抽象队列同步器)

    JUC分类 java并发编程中,关于锁的实现方式有两种synchronized ,Lock AQS--AbstractQueuedSynchronizer

  3. Java并发编程中的若干核心技术,向高手进阶

    来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...

  4. 在 Java OOP 编程中的注意事项

    在 Java OOP 编程中的注意事项 重写 方法 字段 反射 static 接口 abstract Maven JUnit 重写 方法 当子类重写超类的方法时,子类该方法的被访问权限不能低于超类方法 ...

  5. Java多线程编程中Future模式的详解

    转载自 https://www.cnblogs.com/winkey4986/p/6203225.html Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker ...

  6. java动画闪烁_优化Java动画编程中的显示效果

    Java动画编程有多种实现方法,但它们实现的基本原理是一样的,即在屏幕上画出一系列的帧来造成运动的感觉.Java多线程技术是Java动画编程中普遍运用的技术,它在控制动画程序的流程和动画的显示效果方面 ...

  7. 详解Java多线程编程中LockSupport类的线程阻塞用法

    转载自  详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...

  8. synchronized 异常_由浅入深,Java 并发编程中的 Synchronized

    synchronized 作用 synchronized 关键字是 Java 并发编程中线程同步的常用手段之一. 1.1 作用: 确保线程互斥的访问同步代,锁自动释放,多个线程操作同个代码块或函数必须 ...

  9. java 线程由浅入深_由浅入深,Java 并发编程中的 Synchronized(一)

    synchronized 作用 synchronized 关键字是 Java 并发编程中线程同步的常用手段之一. 1.1 作用: 确保线程互斥的访问同步代,锁自动释放,多个线程操作同个代码块或函数必须 ...

最新文章

  1. UA SIE545 优化理论基础 用Farkas定理证明Farkas类的结论
  2. Java设计模式透析之 —— 策略(Strategy)
  3. php 去除中英文空格,php去除字符串首尾中英文空格程序_PHP教程
  4. 使用DiskGenius对虚拟机磁盘进行压缩
  5. 为网格布局图片打造的超炫 CSS 加载动画
  6. Android之AsyncTask异步任务详解总结
  7. 表达式中常用到的运算符
  8. leetcode170. 两数之和 III - 数据结构设计
  9. 数据结构思维 第十三章 二叉搜索树
  10. Linux 内核参数及Oracle相关参数调整
  11. 关于Oracle默认用户名system密码不正确登录不上解决方案
  12. 通过Ajax进行POST提交JSON类型的数据到SpringMVC Controller的方法
  13. 第五章 线性回归 学习笔记上
  14. WinCE全屏手写输入法
  15. Chromium OS并行运行Linux chroot安装Linux
  16. Weblogic缓存清理
  17. Python分支语句练习题
  18. 空气能热水器的优惠价格在哪里找?
  19. Vue3注册全局属性
  20. 麻将牌技法--收藏慢慢学

热门文章

  1. 电脑用java怎么编程,使用java编程从0到1实现一个简单计算器
  2. 优思学院|六西格玛黑带的职责通常包括些什么?
  3. 计算机应用研究》专业刊物论文,《计算机应用研究》CSCD核心期刊 2017年03期目录...
  4. weinre调试工具
  5. Linux 虚拟网络设备详解之 Bridge 网桥
  6. C语言最难学的四大内容是什么?
  7. 关于极光vip与非vip的稳定性、送达率比较
  8. 为什么scanf 函数中不能加\n
  9. 5G接入网架构及应用场景
  10. python数据分析--金融数据处理