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. 【随笔】Axios delete传递数组问题

    pre { overflow-y: auto; max-height: 300px } img { max-width: 500px; max-height: 300px } Axios delete ...

  2. MapReduce之简单的数据清洗----课堂测试

    今天的课堂测试第一步是做简单的数据清洗,直到现在我才知道只是把文本文件的数据改成相应的格式,而我做的一直是寻找一条数据,并转换成相应的格式,但是呢,我感觉还是很高兴的,虽然没有按时完成任务,但也学到了 ...

  3. Vue指令:内置指令和自定义指令

    Vue指令 Vue指令指的是,以v-开头的一组特殊语法 内置指令 v-text v-text指令的作用是:设置标签的内容 默认写法会替换全部内容,差值表达式{{ }}只会替换指定内容 内部支持写表达式 ...

  4. Android Banner - ViewPager 02

    Android Banner - ViewPager 02 现在来给viewpager实现的banenr加上自动轮播 自动轮播的原理,使用handler的延迟消息来实现. 自动轮播实现如下内容 开始轮 ...

  5. pandas安装1

    Python 官方标准发行版并没有自带 Pandas 库,因此需要另行安装.除了标准发行版外,还有一些第三方机构发布的 Python 免费发行版, 它们在官方版本的基础上开发而来,并有针对性的提前安装 ...

  6. pandas之统计函数

    Pandas 的本质是统计学原理在计算机领域的一种应用实现,通过编程的方式达到分析.描述数据的目的.而统计函数则是统计学中用于计算和分析数据的一种工具.在数据分析的过程中,使用统计函数有助于我们理解和 ...

  7. 四月十号java知识点

    1.数组:若干个相同数据类型元素按照一定顺序排列的集合2.JAVA语言内存分为栈内存和堆内存3.方法中的一些基本类型变量和对象的引用变量都在方法中的栈内存中分配4.堆内存用来存放new运算符创建的数组 ...

  8. Oracle AUD审计 找出锁定用户的客户端IP

    问题描述:运用AUD审计找出锁定用户的客户端IP 1.查询被锁用户 SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE FROM DBA_USERS WHERE AC ...

  9. 苹果怎么查看UDID iPhone/iPad查看UDID教程【详解】

      在开发iPhone和iPad软件的时候,要使用UDID来做真机测试,那么如何查看iPhone或者iPad的UDID呢?下面介绍三种最简单的查看UDID的方法,供大家参考!下面就详情来看看. 1.使 ...

  10. Linux云计算运维工程师day28shell编程基础

    一. 1.全局变量.环境变量 Export OLDOBY="I am a oldboy."  Echo OLDOBY OLDOBY="I am a oldboy.&quo ...