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 的比较:

  1. 跨平台性:AWT 的组件依赖于本地系统的 GUI 组件,所以在不同的操作系统上显示效果可能会有所不同;而 Swing 使用自己的组件,可以实现真正的跨平台界面设计。
  2. 外观和风格:AWT 组件使用本地系统的外观和样式,所以在不同的操作系统上可能呈现不同的外观;而 Swing 运行时使用相同的外观和风格,可以使应用程序在所有平台上具有相同的外观和行为。
  3. 性能:AWT 组件是本地组件,直接依赖于本地系统的 GUI 组件,所以运行速度比 Swing 快;而 Swing 组件是纯 Java 组件,运行速度相对较慢。
  4. 功能和灵活性:Swing 提供了更多的组件和功能,同时也提供了更好的灵活性和可扩展性,可以满足更复杂的 GUI 设计需求;而 AWT 功能相对较少,灵活性较差。
  5. 学习曲线: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的应用的更多相关文章

  1. 在线图片压缩后以ImageIO 流的形式 设置大小显示指定页面

    1.Servlet   代码 public class ZoomImgServlet extends HttpServlet implements Servlet { public void init ...

  2. javax.imageio.IIOException: Can't create cache file!

    javax.imageio.IIOException: Can't create cache file! at javax.imageio.ImageIO.createImageInputStream ...

  3. iOS: imageIO完成渐进加载图片

    imageIO完成渐进加载图片 不得不说,人都是有惰性的,一个月又快结束了,这个月虽说有点儿忙,但是绝对不差写几篇博客的时间,有时间去n次桌球厅,有时间玩n把英雄联盟,所谓小撸怡情大撸伤身,这个月游戏 ...

  4. IOS: 使用imageIO获取和修改图片的exif信息

    使用imageIO获取和修改图片的exif信息 一幅图片除了包含我们能看见的像素信息,背后还包含了拍摄时间,光圈大小,曝光等信息.UIImage类将这些细节信息都隐藏了起来,只提供我们关心的图片尺寸, ...

  5. 解决javax.imageio.IIOException: Can't create output stream!

    解决javax.imageio.IIOException: Can't create output stream! javax.imageio.ImageIO.write(image, "J ...

  6. java.imageIo给图片添加水印

    最近项目在做一个商城项目, 项目上的图片要添加水印①,添加图片水印;②:添加文字水印; 一下提供下个方法,希望大家可以用得着: package com.blogs.image; import java ...

  7. iOS中的imageIO与image解码

    ImageIO对外开放的对象有CGImageSourceRef.CGImageDestinationRef,不对外开放的对象有CGImageMetadataRef.CoreGraphics中经常与im ...

  8. ImageIO.wtrie生成jpg图片质量损失方案:BufferedImage生成jpg图片文件流

    Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("jpeg"); ImageW ...

  9. Could not Build module ImageIO

    错误提示:Could not Build module ImageIO: 原因:修改了XCode API 源文件 措施:从一个干净的未曾修改过的XCode中拷贝一份相应的文件添加到发生错误的XCode ...

  10. java IMAGEIO

    javax.imageio使用 ImageIO 类的静态方法可以执行许多常见的图像 I/O 操作. 此包包含一些基本类和接口,有的用来描述图像文件内容(包括元数据和缩略图)(IIOImage): 有的 ...

随机推荐

  1. 记一次 .NET 某传感器采集系统 线程爆高分析

    一:背景 1. 讲故事 前段时间有位朋友微信找到我,说他的程序使用 hsl 库之后,采集 plc 时内存溢出,让我帮忙看一下怎么回事,哈哈,貌似是分析之旅中的第二次和 hsl 打交道,既然找到我,那就 ...

  2. flak_login用法

    基础的信息和全局配置这里就不多说,需要用到再斟酌也可以的.这里也是针对每个模块较为常用的进行解释说明,后期再使用过程中遇到会进行补充. Login_Manager LoginManager是一个类,有 ...

  3. python之re详解

    import re# .匹配任何一个字符,除了换行#[]匹配里面任意一个字符# \d匹配一个数字0-9# \D匹配不是一个数字# \s 匹配一个空格和tab# \S 匹配非空格和tab一个字符# \w ...

  4. python模拟鼠标键盘操作

    前言 1 懒人,工作中可以模拟真人操作,不用自己点击 2游戏人员  这是做模拟外挂的必备知识,不管手机还是电脑游戏,尤其副本 准备模块 代码如下: 实现了一个最简单的输入密码,enter进入的登录过程 ...

  5. [数据库/MySQL]数据库备份与升级:MySQL Percona(RPM) 5.7.24-27 升级到 5.7.31-34

    1 数据库升级方式:RPM包方式升级 [亲测有效] 环境 OS: CENTOS 7 DB: MYSQL 5.7.24-27 1.1 数据库备份 备份以防止升级失败 备份数据库的2个主要方法: 1)用M ...

  6. [Java]排序算法>交换排序>【冒泡排序】(O(N*N)/稳定/N较小/有序/顺序+链式)

    1 冒泡排序 1.1 算法思想 交换排序的基本思想:两两比较待排序记录的关键字,一旦发现2个记录不满足次序要求时,则:进行交换,直到整个序列全部满足要求为止. 1.2 算法特征 属于[交换排序] 冒泡 ...

  7. 0001 嵌入式开发带你从小白到大佬系列之——Linux开发环境搭建—Windows-VMware-Ubuntu环境配置

    如文章标题,我们安装的Linux开发环境是:Windows-VMware-Ubuntu环境 配置,即在windows系统下安装VMware虚拟机,之后在VMware中配置安装Linux系统的常用发行版 ...

  8. v-if与v-for的优先级

    在Vue2中 v-for的优先级要高于v-if 在Vue3中 v-if 的优先级要高于v-for

  9. Node工程的依赖包管理方式

    作者:京东零售 陈震 在前端工程化中,JavaScript 依赖包管理是非常重要的一环.依赖包通常是项目所依赖的第三方库.工具和框架等资源,它们能够帮助我们减少重复开发.提高效率并且确保项目可以正确的 ...

  10. InnoSetup打包 添加.NET环境安装

    这是封装出来的针对.NET环境安装的精简流程 根据流程新建一个配置文件 教程都是很简单的,可以参考<InnoSetup 客户端程序打包教程> 添加.NET安装基本的函数及辅助方法 在[Se ...