Java图形化界面编程—— ImageIO 笔记

2.8.4 ImageIO的使用

在实际生活中,很多软件都支持打开本地磁盘已经存在的图片,然后进行编辑,编辑完毕后,再重新保存到本地磁盘。如果使用AWT要完成这样的功能,那么需要使用到ImageIO这个类,可以操作本地磁盘的图片文件。

方法名称方法功能
static BufferedImage read(File input)读取本地磁盘图片文件
static BufferedImage read(InputStream input)读取本地磁盘图片文件
static boolean write(RenderedImage im, String formatName, File output)往本地磁盘中输出图片文件

案例:

​ 编写图片查看程序,支持另存操作

请添加图片描述

package Draw;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class ReadAndSaveImage {private Frame frame = new Frame("图片查看器");//创建菜单组件MenuBar menuBar = new MenuBar();Menu menu = new Menu("文件");MenuItem open = new MenuItem("打开");MenuItem save = new MenuItem("另存为");//声明BufferedImage对象,作为缓冲区记录本地读取的内存中的图片BufferedImage image;     //不用初始化,等打开图片时再初始化//自定义类继承Canvas,把图片绘制出来private class MyCanvas extends Canvas {@Overridepublic void paint(Graphics g) {g.drawImage(image,0,0,null);}}MyCanvas drawArea = new MyCanvas();public void init() throws Exception {//组装视图//实现打开文件和保持文件的逻辑//给open组件注册监听器open.addActionListener(e ->  {       //gdk9//打开一个文件对话框FileDialog fileDialog = new FileDialog(frame,"打开图片",FileDialog.LOAD);fileDialog.setVisible(true);//获取用户选择的图片路径以及名称String dir = fileDialog.getDirectory();String fileName = fileDialog.getFile();try {image = ImageIO.read(new File(dir,fileName));drawArea.repaint();} catch (IOException ex) {throw new RuntimeException(ex);}});//给save注册监听器save.addActionListener(e -> {//打开保存图片的对话框FileDialog fileDialog = new FileDialog(frame,"保存图片",FileDialog.SAVE);fileDialog.setVisible(true);//获取用户选择的保存路径和文件名称String dir = fileDialog.getDirectory();String fileName = fileDialog.getFile();try {ImageIO.write(image,"JPEG", new File(dir,fileName));} catch (IOException ex) {throw new RuntimeException(ex);}});//将菜单组件添加到菜单条组件中menu.add(open);menu.add(save);//将菜单条组件添加到菜单条中menuBar.add(menu);//将菜单条,画布放入到窗口中frame.setMenuBar(menuBar);frame.add(drawArea);//设置窗口大小和可见性frame.setBounds(200,200,740,508);frame.setVisible(true);//监听窗口关闭frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}public static void main(String[] args) throws Exception {new ReadAndSaveImage().init();}
}

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/679634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB】GA_BP神经网络回归预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 GA_BP神经网络回归预测算法结合了遗传算法(Genetic Algorithm, GA)和BP神经网络(Backpropagation Neural Network, BPNN),用于解…

分享88个文字特效,总有一款适合您

分享88个文字特效,总有一款适合您 88个文字特效下载链接:https://pan.baidu.com/s/1Y0JCf4vLyxIJR6lfT9VHvg?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不…

【PTA|选择题|期末复习】字符串(二)

【PTA|期末复习|选择题】字符串(一) 2-23 设有数组定义“char array[ ] "China", 则数组array所占的空间为()。 A.4个字节 B.5个字节 C.6个字节 D.7个字节 2-24 有定义“char x[ ] " abcdefg "; char y [ ]{a, b, c, d, e , f, …

Gemini VS GPT-4,当前两大顶级AI模型实测

随着谷歌在AI军备竞赛中急起直追,“有史以来最强大模型”Gemini Advanced终于上线,AI爱好者们总算等来了一款号称能够匹敌GPT-4的大语言模型。 月费19.99美元(包含Google One订阅)的Gemini Advanced实际表现如何?究竟…

spring boot 通过 application 切换cache使用的服务

上文 spring boot整合 cache 以redis服务 处理数据缓存 便捷开发 我们写了个整合缓存的基本功能 但 其实我也因为很多时候redis服务没起 等等原因 导致缓存功能整个用不了 其实 最简单的就是 将redis相关配置去掉 不过为了方便 我们可以这样 application.yml文件中这样写 spr…

C++进阶(十五)C++的类型转换

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、C语言中的类型转换二、为什么C需要四种类型转换三、C强制类型转换1、static_cast2、reint…

常见的开源机器人操作系统介绍

开源机器人操作系统(Open Source Robot Operating Systems,ROS)为机器人开发提供了强大的工具和库,使得机器人设计和实现更加高效和便捷。以下是一些常见的开源机器人操作系统: 1. ROS(Robot Opera…

[office] excel如何计算毛重和皮重的时间间隔 excel计算毛重和皮重时间间隔方法 #笔记#学习方法

excel如何计算毛重和皮重的时间间隔 excel计算毛重和皮重时间间隔方法 在日常工作中经常会到用excel,有时需要计算毛重和皮重的时间间隔,具体的计算方式是什么,一起来了解一下吧 在日常工作中经常会到用excel,在整理编辑过磅数据…

Github 2024-02-10 开源项目日报Top10

根据Github Trendings的统计,今日(2024-02-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5Solidity项目1Go项目1Rust项目1PLpgSQL项目1Scala项目1TypeScript项目1 Bluesky Social 应用程序…

Linux--基础开发工具篇(2)(vim)(配置白名单sudo)

目录 前言 1. vim 1.1vim的基本概念 1.2vim的基本操作 1.3vim命令模式命令集 1.4vim底行命令 1.5 异常问题 1.6 批量注释和批量去注释 1.7解决普通用户无法sudo的问题 1.8简单vim配置 前言 在前面我们学习了yum,也就是Linux系统的应用商店 Linux--基础开…

Object类详解

所有类都是Object类的子类,也都具备Object类的所有特性。 Object类的基本特性: 1.Object类是所有类的父类,所有的Java对象都拥有Object类的属性和方法。 2.如果在类的声明中未使用extends,则默认继承Object类。 public class Pe…

2024牛客寒假算法基础集训营2-c Tokitsukaze and Min-Max XOR

来源 题目 Tokitsukaze 有一个长度为 n 的序列 a1,a2,…,an和一个整数 k。 她想知道有多少种序列 b1,b2,…,bm满足: 其中 ⊕\oplus⊕ 为按位异或,具体参见 百度百科:异或 答案可能很大,请输出  mod1e97 后的结果。 输入描述…

「优选算法刷题」:在排序数组中查找元素的第一个和最后一个位置

一、题目 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&…

问题排查利器 - 分布式 trace

在分布式系统开发中,系统间的调用往往会横跨多个应用之间的接口。负责的调用链路也导致了,当线上环境出现问题时,例如请求失败、延迟增加或错误发生,我们无法第一时间确定是哪个环节出了问题,这给故障排查和修复带来了…

AI:125-基于深度学习的航拍图像中地物变化检测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

中国电子学会2020年12月份青少年软件编程Scratch图形化等级考试试卷三级真题(编程题)

编程题(共3题,共30分) 36.绘制图形 1. 准备工作: (1)保留默认小猫角色,隐藏角色; (2)背景为白色背景。 2. 功能实现: (1)绘制如下图所示的图案; &…

从汇编角度解释线程间互斥-mutex互斥锁与lock_guard的使用

多线程并发的竞态问题 我们创建三个线程同时进行购票&#xff0c;代码如下 #include<iostream> #include<thread> #include<list> using namespace std; //总票数 int ticketCount100; //售票线程 void sellTicket(int idx) {while(ticketCount>0){cou…

内网安全-内网穿透

目录 内网渗透 Nc使用详解 Nc监听和探测 Nc传文件 termite内网穿透工具 ssh代理内网穿透 ssh配置socket代理 MSF多级网络穿透 内网渗透 Nc使用详解 Nc监听和探测 Nc传文件 termite内网穿透工具 1、termite 之前叫ew &#xff08;可以进行正向连接&#xff0c;可以…

OpenWrt的ssh无法登陆问题Permission denied, please try again.解决

OpenWrt的ssh无法登陆问题Permission denied, please try again.解决 一、情况描述&#xff1a; ​ 我根据B站的博主提供的教程对红米AC2100路由器进行刷机。最开始刷的Openwrt是可以连接ssh的&#xff0c;后面的升级改进版就无法进入ssh了&#xff0c;具体的错误如下。 #采…

vue双向绑定的原理

Vue双向绑定的原理主要基于数据劫持和发布-订阅模式。通过使用Object.defineProperty方法来劫持数据属性的setter和getter&#xff0c;当数据发生变化时&#xff0c;能够触发相应的监听器。 具体来说&#xff0c;当一个组件的属性值发生变化时&#xff0c;Vue会触发一个更新函…