ImageIO的应用

打印 上一主题 下一主题

主题 805|帖子 805|积分 2415

ImageIO的应用

一、关于IO流

在讲imageio之前,我们先来复习一下IO流的使用。
这里我建立一个Java类,用来实现读取文档中的内容,并且能够识别换行,话不多说,上代码:
  1. package com.Evan.demo;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;
  7. import java.io.InputStreamReader;
  8. public class ShowFile {
  9.     // 创建方法transReadByBuf()从文件读出内容;
  10.     public void transReadByBuf(File file) {
  11.         FileInputStream fis;
  12.         InputStreamReader isr;
  13.         BufferedReader br;
  14.         String n;
  15.         try {
  16.             fis = new FileInputStream(file);
  17.             isr = new InputStreamReader(fis);
  18.             br = new BufferedReader(isr);
  19. ​            while ((n = br.readLine()) != null) {
  20. ​    // 从字符输入流中读取文本时可以使用readLine()方法,从而对换行符进行识别,一行一行地读取文本;
  21. ​                System.*out*.println(n);
  22. ​            }
  23. ​            fis.close();
  24. ​            isr.close();
  25. ​            br.close();
  26. ​        } catch (FileNotFoundException e) {
  27. ​            e.printStackTrace();
  28. ​        } catch (IOException e) {
  29. ​            e.printStackTrace();
  30. ​        }
  31. ​    }
  32. ​    //  在测试方法中调用transReadByBuf()方法。
  33. ​    public static void main(String[] args) {
  34. ​        File file = new File("a.txt");
  35. ​        if (!file.exists()) {
  36. ​            try {
  37. ​                file.createNewFile();
  38. ​            } catch (IOException e) {
  39. ​                e.printStackTrace();
  40. ​            }
  41. ​        }
  42. ​        ShowFile showFile = new ShowFile();
  43. ​        showFile.transReadByBuf(file);
  44. ​    }
  45. }
复制代码
代码是不是简洁易懂?有手就行。
注意一下,这里的文档需要建立在F:\Java_Prj\Java_Project包下
这里贴张图,展示一下文档内容

然后控制台输出为下图:

是不是so easy ,以上内容完全是学校老师教的内容,然后下面就是本文的主要内容啦(敲黑板.jpg)!
二、ImageIO读取图片

1.使用AWT绘制窗口

当界面很复杂,代码很多时,我们就建立了一个init()方法用于组装界面,然后在main方法中调用init()方法,代码如下:
  1. package com.Evan.demo;
  2. import java.awt.*;
  3. public class AWT_init {
  4.     Frame frame = new Frame("init方法");
  5.     public void init(){
  6.     }
  7.     public static void main(String[] args) {
  8.         new AWT_init().init();
  9.     }
  10. }
复制代码
当然啦,上面的代码只是一个小框架,没有实现效果啦;
然后我们用AWT代码来写一个简单的窗口,代码如下:
  1. package com.Evan.demo;
  2. import java.awt.*;
  3. import java.awt.event.WindowAdapter;
  4. import java.awt.event.WindowEvent;
  5. public class Awt_demo {
  6.     private Frame frame = new Frame();
  7.    
  8.     public void init() throws Exception{
  9.         frame.setBounds(200,200,740,508);
  10.         frame.setVisible(true);
  11.         frame.addWindowListener(new WindowAdapter() {
  12.             //重写方法实现关闭窗口效果
  13.         @Override
  14.         public void windowClosing(WindowEvent e) {
  15.             System.exit(0);
  16.         }
  17.     });
  18. }
  19.     public static void main(String[] args) throws Exception {
  20.         new Awt_demo().init();
  21.     }
  22. }
复制代码
实现的效果如下:

一个小窗口就完成啦!
2.使用imageio读取图片

接下来我们就来写一个关于AWT的代码,用来读取本地图片
  1. package com.Evan.demo;
  2. import javax.imageio.ImageIO;
  3. import java.awt.*;
  4. import java.awt.event.WindowAdapter;
  5. import java.awt.event.WindowEvent;
  6. import java.awt.image.BufferedImage;
  7. import java.io.File;
  8. import java.io.IOException;
  9. public class Awt_demo {
  10.     private Frame frame = new Frame("图片查看器");
  11.     BufferedImage image;
  12.     private class MyCanvas extends Canvas {
  13.         @Override
  14.         public void paint(Graphics g) {
  15.             g.drawImage(image, 0, 0, null);
  16.         }
  17.     }
  18.     MyCanvas drawArea = new MyCanvas();
  19.     public void init() throws Exception {
  20.         //组装视图
  21.         try {
  22.             File file = new File("C:\\Users\\Evan\\Desktop\\Evan.jpg");
  23.             image = ImageIO.*read*(file);
  24.             drawArea.repaint();
  25.         } catch (IOException e) {
  26.             System.*out*.println(e.getMessage());
  27.         }
  28.         frame.add(drawArea);
  29.         frame.setBounds(200, 200, 740, 508);
  30.         frame.setVisible(true);
  31.         frame.addWindowListener(new WindowAdapter() {
  32.             @Override
  33.             public void windowClosing(WindowEvent e) {
  34.                 System.*exit*(0);
  35.             }
  36.         });
  37.     }
  38.     public static void main(String[] args) throws Exception {
  39.         new Awt_demo().init();
  40.     }
  41. }
复制代码
代码实现效果如下:

这里没有完全展示出图片,不过不要紧,我们可以修改代码
  1. frame.setBounds(200, 200, 740, 508);
复制代码
数值分别表示(x,y,width,height)
3.使用Swing绘制窗口
  1. package com.Evan.demo;
  2. import java.awt.Graphics;
  3. import java.awt.Image;
  4. import java.io.*;
  5. import javax.imageio.ImageIO;
  6. import javax.swing.*;
  7. public class ImageDemo extends JFrame {
  8. ​    private Image image;
  9. ​    public ImageDemo() {
  10. ​        setTitle("图片展示");
  11. ​        setBounds(200, 200, 740, 708);
  12. ​        setDefaultCloseOperation(WindowConstants.*EXIT_ON_CLOSE*);
  13. ​        setVisible(true);
  14. ​    }
  15. ​    public void loadImage(String path) {
  16. ​        try {
  17. ​            image = ImageIO.*read*(new File(path));
  18. ​        } catch (IOException e) {
  19. ​            System.*out*.println(e.getMessage());
  20. ​        }
  21. ​    }
  22. ​    @Override
  23. ​    public void paint(Graphics g) {
  24. ​        if (image != null) {
  25. ​            g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
  26. ​        }
  27. ​    }
  28. ​    public static void main(String[] args) {
  29. ​        ImageDemo id = new ImageDemo();
  30. ​        id.loadImage("C:\\Users\\Evan\\Desktop\\Evan.jpg");
  31. ​        id.repaint();
  32. ​    }
  33. }
复制代码
这里说一下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流可以读取链接形式的图片,也可以读取本地的图片。当然啦,上面两个代码块都是读取本地图片的,以下展示读取链接形式图片的代码:
  1. package com.Evan.demo;
  2. import java.awt.Image;
  3. import java.io.IOException;
  4. import java.net.URL;
  5. import javax.imageio.ImageIO;
  6. import javax.swing.ImageIcon;
  7. import javax.swing.JFrame;
  8. import javax.swing.JLabel;
  9. public class ReadImage
  10. {
  11.     public static void main( String[] args )
  12.     {
  13.         JFrame jf = new JFrame("图片展示");
  14.         Image image = null;
  15. ​        jf.setSize(250, 250);
  16. ​        try {
  17. ​            URL url = new URL("https://pic.cnblogs.com/avatar/3178304/20230603204309.png");
  18. ​            image = ImageIO.*read*(url);
  19. ​        } catch (IOException e) {
  20. ​            System.*out*.println(e.getMessage());
  21. ​        }
  22. ​        JLabel label = new JLabel(new ImageIcon(image));
  23. ​        jf.add(label);
  24. ​        jf.setVisible(true);
  25. ​    }
  26. }
复制代码
效果图如下:

别看这代码少,但是导入的包多啊,可能这就是Swing的魅力吧
而如果要读取本地图片只需将上面的try catch代码改为:
  1. try {
  2.     File file = new File("C:\\Users\\Evan\\Desktop\\Evan.jpg");
  3.     image = ImageIO.*read*(file);
  4. } catch (IOException e) {
  5.     System.*out*.println(e.getMessage());
  6. }
复制代码
三、关于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去了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表