ImageIO的應用 (AWT和Swing初接觸)

来源:https://www.cnblogs.com/Evan-Ye/archive/2023/06/10/17470616.html
-Advertisement-
Play Games

# ImageIO的應用 # 一、關於IO流 在講imageio之前,我們先來複習一下IO流的使用。 這裡我建立一個Java類,用來實現讀取文檔中的內容,並且能夠識別換行,話不多說,上代碼: ```java package com.Evan.demo; import java.io.Buffered ...


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去了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 📝背景 公司高級表單組件ProForm高階組件都建立在jsx的運用配置上,項目在實踐落地過程中積累了豐富的經驗,也充分感受到了jsx語法的靈活便捷和可維護性強大,享受到了用其開發的樂趣,獨樂樂不如眾樂樂,為了幫助大家更好的運用jsx,開發提效,特此總結分享。 💎效果對比 以前 以往我們開發一個列 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 Vue 3 穩定已經有一段時間了。許多代碼庫正在生產中使用它,其他人最終也必須進行遷移。我有機會與它一起工作,並記錄了我的錯誤,這可能是你想避免的。 1.使用響應式助手聲明基本類型 數據聲明曾經很簡單,但現在有多個輔助工具可用。現在的一般 ...
  • # JS語法學習 **Javascript:客戶端的腳本語言** ## **1. JavaScript數據類型** ![](https://img2023.cnblogs.com/blog/3008601/202306/3008601-20230607170622855-1334758269.png ...
  • >我們是[袋鼠雲數棧 UED 團隊](http://ued.dtstack.cn/),致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。。 >本文作者:霽明 # 一、背景 ## 1、業務背景 業務中會有一些需要實現拖拽的場景,尤其是偏視覺方向以及移動端 ...
  • 在前端開發中,最常見的字元編碼方案是 UTF-8。UTF-8是一種可變長度的 Unicode 編碼方案,可以表示幾乎所有的字元,並且與 ASCII 相容。由於互聯網的廣泛應用和多語言的支持,UTF-8成為了前端開發中的首選字元編碼方案。 使用UTF-8編碼的好處: 1. 多語言支持 :UTF-8可以 ...
  • 在現有的大環境下,越來越註重用戶體驗,因此對圖片庫的要求也日益攀升。從成本的角度來看,使用 AVIF 格式可以節省大量的網路帶寬和存儲空間,減少網站載入時間,可以改善用戶體驗,進而提高網站的效率和收益,節約大量的費用。 AVIF 的優點在於它可以提供更好的圖像質量和更小的文件大小。與 JPEG 相... ...
  • Map
    基於electron25+vite4+vue3仿製chatgpt客戶端聊天模板ElectronChatGPT。 electron-chatgpt 使用最新桌面端技術Electron25.x結合Vite4.x全家桶技術開發跨端模仿ChatGPT智能聊天程式模板。支持經典+分欄兩種佈局、暗黑+明亮主題模 ...
  • 在應用層下的文件操作只需要調用微軟應用層下的`API`函數及`C庫`標準函數即可,而如果在內核中讀寫文件則應用層的API顯然是無法被使用的,內核層需要使用內核專有API,某些應用層下的API只需要增加Zw開頭即可在內核中使用,例如本章要講解的文件與目錄操作相關函數,多數ARK反內核工具都具有對文件的... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...