ImageIO的应用
ImageIO的应用
一、关于IO流
在讲imageio之前,我们先来复习一下IO流的使用。
这里我建立一个Java类,用来实现读取文档中的内容,并且能够识别换行,话不多说,上代码:
package com.Evan.demo;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class ShowFile {
// 创建方法transReadByBuf()从文件读出内容;
public void transReadByBuf(File file) {
FileInputStream fis;
InputStreamReader isr;
BufferedReader br;
String n;
try {
fis = new FileInputStream(file);
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);
while ((n = br.readLine()) != null) {
// 从字符输入流中读取文本时可以使用readLine()方法,从而对换行符进行识别,一行一行地读取文本;
System.*out*.println(n);
}
fis.close();
isr.close();
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 在测试方法中调用transReadByBuf()方法。
public static void main(String[] args) {
File file = new File("a.txt");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
ShowFile showFile = new ShowFile();
showFile.transReadByBuf(file);
}
}
代码是不是简洁易懂?有手就行。
注意一下,这里的文档需要建立在
F:\Java_Prj\Java_Project包下
这里贴张图,展示一下文档内容

然后控制台输出为下图:

是不是so easy ,以上内容完全是学校老师教的内容,然后下面就是本文的主要内容啦(敲黑板.jpg)!
二、ImageIO读取图片
1.使用AWT绘制窗口
当界面很复杂,代码很多时,我们就建立了一个init()方法用于组装界面,然后在main方法中调用init()方法,代码如下:
package com.Evan.demo;
import java.awt.*;
public class AWT_init {
Frame frame = new Frame("init方法");
public void init(){
}
public static void main(String[] args) {
new AWT_init().init();
}
}
当然啦,上面的代码只是一个小框架,没有实现效果啦;
然后我们用AWT代码来写一个简单的窗口,代码如下:
package com.Evan.demo;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Awt_demo {
private Frame frame = new Frame();
public void init() throws Exception{
frame.setBounds(200,200,740,508);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
//重写方法实现关闭窗口效果
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) throws Exception {
new Awt_demo().init();
}
}
实现的效果如下:

一个小窗口就完成啦!
2.使用imageio读取图片
接下来我们就来写一个关于AWT的代码,用来读取本地图片
package com.Evan.demo;
import javax.imageio.ImageIO;
import java.awt.*;
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 Awt_demo {
private Frame frame = new Frame("图片查看器");
BufferedImage image;
private class MyCanvas extends Canvas {
@Override
public void paint(Graphics g) {
g.drawImage(image, 0, 0, null);
}
}
MyCanvas drawArea = new MyCanvas();
public void init() throws Exception {
//组装视图
try {
File file = new File("C:\\Users\\Evan\\Desktop\\Evan.jpg");
image = ImageIO.*read*(file);
drawArea.repaint();
} catch (IOException e) {
System.*out*.println(e.getMessage());
}
frame.add(drawArea);
frame.setBounds(200, 200, 740, 508);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.*exit*(0);
}
});
}
public static void main(String[] args) throws Exception {
new Awt_demo().init();
}
}
代码实现效果如下:

这里没有完全展示出图片,不过不要紧,我们可以修改代码
frame.setBounds(200, 200, 740, 508);
数值分别表示(x,y,width,height)
3.使用Swing绘制窗口
package com.Evan.demo;
import java.awt.Graphics;
import java.awt.Image;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;
public class ImageDemo extends JFrame {
private Image image;
public ImageDemo() {
setTitle("图片展示");
setBounds(200, 200, 740, 708);
setDefaultCloseOperation(WindowConstants.*EXIT_ON_CLOSE*);
setVisible(true);
}
public void loadImage(String path) {
try {
image = ImageIO.*read*(new File(path));
} catch (IOException e) {
System.*out*.println(e.getMessage());
}
}
@Override
public void paint(Graphics g) {
if (image != null) {
g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
}
}
public static void main(String[] args) {
ImageDemo id = new ImageDemo();
id.loadImage("C:\\Users\\Evan\\Desktop\\Evan.jpg");
id.repaint();
}
}
这里说一下AWT和Swing的比较啦,chat机器人是这样解释的:
AWT(Abstract Window Toolkit)和 Swing 是 Java 中两种用于 GUI 编程的图形库。它们都可以创建各种 GUI 元素,如窗口、按钮、文本框等,并提供了类似事件处理、布局管理等功能。
下面是 AWT 和 Swing 的比较:
- 跨平台性:AWT 的组件依赖于本地系统的 GUI 组件,所以在不同的操作系统上显示效果可能会有所不同;而 Swing 使用自己的组件,可以实现真正的跨平台界面设计。
- 外观和风格:AWT 组件使用本地系统的外观和样式,所以在不同的操作系统上可能呈现不同的外观;而 Swing 运行时使用相同的外观和风格,可以使应用程序在所有平台上具有相同的外观和行为。
- 性能:AWT 组件是本地组件,直接依赖于本地系统的 GUI 组件,所以运行速度比 Swing 快;而 Swing 组件是纯 Java 组件,运行速度相对较慢。
- 功能和灵活性:Swing 提供了更多的组件和功能,同时也提供了更好的灵活性和可扩展性,可以满足更复杂的 GUI 设计需求;而 AWT 功能相对较少,灵活性较差。
- 学习曲线:Swing 的学习曲线相对于 AWT 更加陡峭,因为它提供了更多的功能和灵活性;而 AWT 的学习曲线比较平缓。
总之,AWT 和 Swing 都是 Java 中用于 GUI 编程的图形库,它们在跨平台性、外观和风格、性能、功能和灵活性以及学习曲线等方面有所区别,开发者可以根据具体需求进行选择。
就本人来说呢,在实现读取图片上最直观的就是Swing需要继承JFrame这个类,以此实现效果,很实用,推荐!
4.ImageIO读取url和load图片
咳咳回到正题,关于读取图片,ImageIO流可以读取链接形式的图片,也可以读取本地的图片。当然啦,上面两个代码块都是读取本地图片的,以下展示读取链接形式图片的代码:
package com.Evan.demo;
import java.awt.Image;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class ReadImage
{
public static void main( String[] args )
{
JFrame jf = new JFrame("图片展示");
Image image = null;
jf.setSize(250, 250);
try {
URL url = new URL("https://pic.cnblogs.com/avatar/3178304/20230603204309.png");
image = ImageIO.*read*(url);
} catch (IOException e) {
System.*out*.println(e.getMessage());
}
JLabel label = new JLabel(new ImageIcon(image));
jf.add(label);
jf.setVisible(true);
}
}
效果图如下:

别看这代码少,但是导入的包多啊,可能这就是Swing的魅力吧
而如果要读取本地图片只需将上面的try catch代码改为:
try {
File file = new File("C:\\Users\\Evan\\Desktop\\Evan.jpg");
image = ImageIO.*read*(file);
} catch (IOException e) {
System.*out*.println(e.getMessage());
}
三、关于Swing JLabel类
1.JLabel介绍
JLabel类可以显示文本或图像。通过在显示区域中设置垂直和水平对齐来对齐标签的内容。默认情况下,标签在显示区域中垂直居中,纯文本标签前沿对齐,仅图像标签水平居中。
如上面代码块中,窗口设置了长宽都是600,正好可以展示出图片全貌,但如果窗口过小,窗口中也会展示图片最中间的内容,即默认水平居中。
2.类构造函数
| 构造函数 | 描述 | |
|---|---|---|
JLabel() |
创建一个没有图像且标题为空字符串的JLabel实例。 |
|
JLabel(Icon image) |
使用指定的图像创建JLabel实例。 |
|
JLabel(Icon image, int horizontalAlignment) |
使用指定的图像和水平对齐创建JLabel实例。 |
|
JLabel(String text) |
使用指定的文本创建JLabel实例。 |
|
JLabel(String text, Icon icon, int horizontalAlignment) |
使用指定的文本,图像和水平对齐创建JLabel实例。 |
|
JLabel(String text, int horizontalAlignment) |
使用指定的文本和水平对齐方式创建JLabel实例。 |
当然啦,我们使用的是第二个。
好啦,这次的分享结束啦,继续学习Java web去了。
ImageIO的应用的更多相关文章
- 在线图片压缩后以ImageIO 流的形式 设置大小显示指定页面
1.Servlet 代码 public class ZoomImgServlet extends HttpServlet implements Servlet { public void init ...
- javax.imageio.IIOException: Can't create cache file!
javax.imageio.IIOException: Can't create cache file! at javax.imageio.ImageIO.createImageInputStream ...
- iOS: imageIO完成渐进加载图片
imageIO完成渐进加载图片 不得不说,人都是有惰性的,一个月又快结束了,这个月虽说有点儿忙,但是绝对不差写几篇博客的时间,有时间去n次桌球厅,有时间玩n把英雄联盟,所谓小撸怡情大撸伤身,这个月游戏 ...
- IOS: 使用imageIO获取和修改图片的exif信息
使用imageIO获取和修改图片的exif信息 一幅图片除了包含我们能看见的像素信息,背后还包含了拍摄时间,光圈大小,曝光等信息.UIImage类将这些细节信息都隐藏了起来,只提供我们关心的图片尺寸, ...
- 解决javax.imageio.IIOException: Can't create output stream!
解决javax.imageio.IIOException: Can't create output stream! javax.imageio.ImageIO.write(image, "J ...
- java.imageIo给图片添加水印
最近项目在做一个商城项目, 项目上的图片要添加水印①,添加图片水印;②:添加文字水印; 一下提供下个方法,希望大家可以用得着: package com.blogs.image; import java ...
- iOS中的imageIO与image解码
ImageIO对外开放的对象有CGImageSourceRef.CGImageDestinationRef,不对外开放的对象有CGImageMetadataRef.CoreGraphics中经常与im ...
- ImageIO.wtrie生成jpg图片质量损失方案:BufferedImage生成jpg图片文件流
Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("jpeg"); ImageW ...
- Could not Build module ImageIO
错误提示:Could not Build module ImageIO: 原因:修改了XCode API 源文件 措施:从一个干净的未曾修改过的XCode中拷贝一份相应的文件添加到发生错误的XCode ...
- java IMAGEIO
javax.imageio使用 ImageIO 类的静态方法可以执行许多常见的图像 I/O 操作. 此包包含一些基本类和接口,有的用来描述图像文件内容(包括元数据和缩略图)(IIOImage): 有的 ...
随机推荐
- 【随笔】Axios delete传递数组问题
pre { overflow-y: auto; max-height: 300px } img { max-width: 500px; max-height: 300px } Axios delete ...
- Windows的压缩文件夹(zip/cab)
https://weibo.com/1114096665/DtHXgvnva #windows10# 硬要把zip.cab文件当文件夹,不爽怎么解决? 删除注册表 "HKEY_CLASSES ...
- 【Visual Leak Detector】配置项 ForceIncludeModulesmd
说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记.本篇介绍 VLD 配置文件中配置项 ForceIncludeModules 的使用方法. 同系列文章目录可见 <内存泄漏检测工具&g ...
- 使用 screw(螺丝钉) 快速生成数据库文档
一.框架介绍 回想起那个去年的7月份,第一份实习,组长让我写一份金蝶云的SQL文档,当时一看2000多张表,当时就猛吸一根烟,然后去gitee看看有没有好的框架快速生成 SQL 文档 ,由此找到了 s ...
- PyCharm解决Git冲突
技术背景 在前面的一篇博客中,我们介绍了Fork到自己名下的本地仓库如何与远程原始仓库创建链接的方法.在这篇文章中,我们将要讲解如何应对在这种异步开发的过程中经常有可能会遇到的Git冲突问题,在Pyc ...
- Oracle宕机之PMON (ospid: 248987): terminating the instance due to error 484(另附hugepage配置方法)
数据库版本:11.2.0.4 RAC环境 操作系统版本:Asianux Server release 7.3 数据库报错分析 接到业务消息,应用无法访问,开发人员查看日志后发现无法连接数据库. 查看数 ...
- kubernetes(k8s) 安装 Prometheus + Grafana
kubernetes(k8s) 安装 Prometheus + Grafana 组件说明 MetricServer:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内 ...
- 学习docker看此文足以
什么是 Docker Docker 最初是 dotCloud 公司创始人 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 ,主要项目代码在 上进行 ...
- 用Abp实现双因素认证(Two-Factor Authentication, 2FA)登录(一):认证模块
@ 目录 原理 用户验证码校验模块 双因素认证模块 改写登录 在之前的博文 用Abp实现短信验证码免密登录(一):短信校验模块 一文中,我们实现了用户验证码校验模块,今天来拓展这个模块,使Abp用户系 ...
- DVWA上low级别反射型,存储型,DOM型XSS攻击获取用户cookie
1.什么是反射型 XSS 攻击? 反射型 XSS 是指应用程序通过 Web 请求获取不可信赖的数据,并在未检验数据是否存在恶意代码的情况下,将其发送给用户. 反射型 XSS 一般可以由攻击者构造带有恶 ...