主頁 > 後端開發 > ImageIO的應用 (AWT和Swing初接觸)

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

2023-06-10 07:51:44 後端開發

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/554745.html

標籤:Java

上一篇:JavaWeb準備作業和部分環境配置

下一篇:返回列表

標籤雲
其他(160664) Python(38218) JavaScript(25489) Java(18216) C(15237) 區塊鏈(8270) C#(7972) AI(7469) 爪哇(7425) MySQL(7241) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4589) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2435) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) 功能(1967) HtmlCss(1956) Web開發(1951) C++(1933) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1880) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • ImageIO的應用 (AWT和Swing初接觸)

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

    uj5u.com 2023-06-10 07:51:44 more
  • JavaWeb準備作業和部分環境配置

    # JavaWeb ## 基本概念 web開發: - web:網頁的意思 - 靜態web:提供的資料資源不會發生改變 - 動態web:資料是不斷變化的,現代網站幾乎都是動態網站技術堆疊: Servlet/JSP:基于java,主推B/S架構,可以 ? 承載高并發,語法類似ASP ? ASP:微軟,國內 ......

    uj5u.com 2023-06-10 07:51:03 more
  • java集成chatGpt完整案例代碼(效果和官網一樣逐字輸出)

    背景 要集成chatGpt參考我上一篇文章即可。但是,如果要實作官網一樣的效果,逐字輸出,難度就提升了不少了。經過在官網的研究發現它應該是采用了SSE技術,這是一種最新的HTTP互動技術。SSE(Server-Sent Events):通俗解釋起來就是一種基于HTTP的,以流的形式由服務端持續向客戶 ......

    uj5u.com 2023-06-10 07:50:36 more
  • Java物件中轉換空值的欄位

    在后端回傳資料給前端時,公司的框架會把值為null的資料去掉,方便前端取值。 如:Person物件為:{name:"浩二", age:24, weight:null, height:114},那回傳給前端的就為{name:"浩二", age:24, height:114}。 如果這個時候有個需求: ......

    uj5u.com 2023-06-10 07:50:12 more
  • 構建高可用、高效、安全和可靠的分布式系統:Spring Cloud為開發人

    Spring Cloud是一個基于Spring框架的云應用開發工具箱,可以快速構建分布式應用程式。它為開發人員提供了許多有用的功能,例如服務發現、負載均衡、配置管理和應用監控等,這些功能可以使分布式系統更加穩定和可靠。 如果您還沒有了解過Spring Cloud,我強烈建議您觀看以下這個視頻鏈接: ......

    uj5u.com 2023-06-10 07:50:05 more
  • Java 集合框架體系簡介

    陣列可以通過索引快速訪問和操作元素,在許多場景下仍然是非常有用的,但如果需要動態調整大小或保存不同型別的元素,則可以考慮使用集合類來代替陣列。集合類還提供了一系列增加、洗掉、修改和查找元素的方法。集合框架中還提供了多種優化和封裝好的實作類,通過使用合適的集合類可以更高效地組織和操作資料。 ......

    uj5u.com 2023-06-10 07:44:50 more
  • websocket

    # 1. WebSocket介紹 * WebSocket 是一種網路通信協議。RFC6455 定義了它的通信標準。 * WebSocket 是 HTML5 開始提供的一種在單個 TCP 連接上進行全雙工通訊的協議。 * HTTP 協議是一種無狀態的、無連接的、單向的應用層協議。它采用了請求/回應模型 ......

    uj5u.com 2023-06-10 07:25:34 more
  • 現代 C++ 性能飛躍之:移動語意

    *以下內容為本人的學習筆記,如需要轉載,請宣告原文鏈接[ 微信公眾號「ENG八戒」](https://mp.weixin.qq.com/s/Xd_FwT8E8Yx9Vnb64h6C8w) > 帶給現代 C++ 性能飛躍的特性很多,今天一邊聊技術,一邊送福利! ![](https://img2023. ......

    uj5u.com 2023-06-09 07:51:56 more
  • CentOS7環境編譯python3.9版本pjsua

    環境:CentOS 7.6_x64 Python版本 :3.9.12 pjsip版本:2.13 一、背景描述 pjsip地址:https://www.pjsip.org/ GitHub地址:https://github.com/pjsip/pjproject pjsip檔案地址:https://do ......

    uj5u.com 2023-06-09 07:51:42 more
  • C++面試八股文:C++中,設計一個類要注意哪些東西?

    某日二師兄參加XXX科技公司的C++工程師開發崗位第9面: > 面試官:C++中,設計一個類要注意哪些東西? > > 二師兄:設計一個類主要考慮以下幾個方面:1.面向物件的封裝、繼承及多型。2.`big three`或者`big five`。3.運算子和函式多載、靜態成員、友元、例外處理等相關問題。 ......

    uj5u.com 2023-06-09 07:51:31 more