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. 聊一聊今年实例分割领域的进展和未来展望
  2. [文档].JLINK挂了怎么办?自己修![转载].JLINK_V8固件烧录和固件升级指导.pdf
  3. 图像特征 可视化_使用卫星图像可视化建筑区域
  4. 李秀计算机文化基础,计算机文化基础(李秀)绪论.pptx
  5. 鼠标方式自动弹出内容html,html 在一个超链接上面,鼠标移动上去时,也显示一串文字,如何实现...
  6. mini-css-extract-plugin简介
  7. IllegalStateException: Error reading delta file hdfs://xxx/spark/xx/state/0/11/1.delta
  8. 音乐社交娱乐教育APP Makeapp Wireframe Kit
  9. FreeRTOS+STM32F103中断中发送任务通知单片机死机问题
  10. 如何做好数据分析师的职业规划?
  11. HBuilder X 设置保存时编译
  12. centos7设置虚拟内存
  13. 搭建好的飞飞服务器(虚拟机)+客户端(物理机)分享给大家
  14. windows下安装虚拟机
  15. centOS最全下载地址
  16. 罗永浩和锤子手机:对不起,我被你打动了
  17. oracle vm虚拟盒,虚拟盒子内部版下载|虚拟盒子虚拟机下载_最火软件站
  18. Python吴恩达深度学习作业22 -- Emoji表情情感分类器
  19. qt网络编程及readyread信号
  20. java中jQuery自我学习中介

热门文章

  1. 驾照----有效期mark
  2. 金融外包测试项目经验分享
  3. 绿色版电脑站手机站仿站小工具
  4. 红酒泡洋葱喝了有什么好处
  5. 开发笔记:RichEdit line insertion error.的逃避处理办法
  6. 使用 ChatGPT API 和节点创建 CLI 聊天机器人.js
  7. 远程计算机打印,通过远程桌面访问进行远程打印-Splashtop
  8. win10录屏怎么用_怎么用U盘重装win10系统
  9. Zbrush人体手部模型雕刻 | 手部笔刷太好用了
  10. mysql用天兔监测什么_天兔监控服务器和mysql,redis等监控