利用Java實(shí)現(xiàn)在線圖片URL轉(zhuǎn)換為Base64以及反向解析成圖片
1. 基本知識
Base64 是一種將二進(jìn)制數(shù)據(jù)編碼為 ASCII 字符串格式的方法,常用于在網(wǎng)絡(luò)中安全傳輸圖片、文件等內(nèi)容
編碼后只包含
[A-Za-z0-9+/=]
,適合在文本協(xié)議中傳輸編碼后的內(nèi)容比原始內(nèi)容大約多出 33% 的體積
常用于 HTML
<img src="data:image/jpeg;base64,...">
中內(nèi)嵌圖片、郵件傳輸、JWT 等
在線圖片 URL -> 下載圖片內(nèi)容 -> 轉(zhuǎn)為字節(jié)數(shù)組 -> Base64 編碼
- 利用 java.net.URL 獲取網(wǎng)絡(luò)資源
- 用 InputStream 讀取圖片數(shù)據(jù)
- 使用 Base64.getEncoder().encodeToString() 進(jìn)行編碼
但是Base64是無法轉(zhuǎn)化為在線鏈接的,只能解析成圖片下載下來而已!
類型 | 能否轉(zhuǎn)化 | 說明 |
---|---|---|
URL → Base64 | ? 可以 | 直接讀取資源,轉(zhuǎn)為字節(jié)數(shù)組后編碼 |
Base64 → URL | ? 不行 | 必須先上傳至某個(gè)圖床或服務(wù)器獲取新 URL |
基本的轉(zhuǎn)化過程可以通過在線網(wǎng)址:https://www.toolhelper.cn/Image/Base64?tab=image
2. Demo
在線Url轉(zhuǎn)化為Base64的Demo如下:(只需要替換鏈接即可)
import java.io.*; import java.net.URL; import java.util.Base64; public class ImageUtils { /** * 在線圖片 URL 轉(zhuǎn)為 Base64 字符串 * @param imageUrl 圖片的在線地址 * @return Base64 編碼字符串 * @throws IOException 網(wǎng)絡(luò)異?;蜃x取失敗 */ public static String convertImageUrlToBase64(String imageUrl) throws IOException { URL url = new URL(imageUrl); try (InputStream is = url.openStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream()) { byte[] buffer = new byte[8192]; // 緩沖區(qū) int bytesRead; while ((bytesRead = is.read(buffer)) != -1) { baos.write(buffer, 0, bytesRead); } // 獲取字節(jié)數(shù)組并進(jìn)行 Base64 編碼 byte[] imageBytes = baos.toByteArray(); return Base64.getEncoder().encodeToString(imageBytes); } } // 示例入口 public static void main(String[] args) throws IOException { String url = "https://example.com/image.jpg"; String base64 = convertImageUrlToBase64(url); System.out.println("Base64 編碼結(jié)果:" + base64); } }
截圖如下:
將 Base64 字符串保存為本地圖片文件(無法執(zhí)行):
import java.io.*; import java.util.Base64; public class Base64ToImage { /** * 將 Base64 編碼字符串轉(zhuǎn)為圖片并保存本地 * @param base64Str 圖片的 Base64 字符串 * @param outputPath 本地保存路徑,如 "output.jpg" * @throws IOException 寫入異常 */ public static void saveBase64ToImage(String base64Str, String outputPath) throws IOException { byte[] imageBytes = Base64.getDecoder().decode(base64Str); try (OutputStream os = new FileOutputStream(outputPath)) { os.write(imageBytes); } } // 示例入口 public static void main(String[] args) throws IOException { String base64Str = "你的Base64編碼"; saveBase64ToImage(base64Str, "output.jpg"); System.out.println("圖片已保存至本地"); } }
截圖如下:
是因?yàn)?Java 中字符串字面量的最大長度為 65,535 個(gè)字符(字符數(shù),不是字節(jié)數(shù))。而一整段 Base64 編碼很容易超過這個(gè)限制,尤其是圖片
可以保存在外部文件中,然后通過 Java 讀取
import java.io.*; import java.util.Base64; public class Base64ToImage { /** * 從文本文件中讀取 Base64,并保存為圖片 * @param base64FilePath 存儲 Base64 的 .txt 文件路徑 * @param outputImagePath 輸出圖片路徑 * @throws IOException */ public static void convertBase64FileToImage(String base64FilePath, String outputImagePath) throws IOException { // 讀取 Base64 內(nèi)容 StringBuilder sb = new StringBuilder(); try (BufferedReader reader = new BufferedReader(new FileReader(base64FilePath))) { String line; while ((line = reader.readLine()) != null) { sb.append(line); } } // 解碼并寫出圖片 byte[] imageBytes = Base64.getDecoder().decode(sb.toString()); try (OutputStream os = new FileOutputStream(outputImagePath)) { os.write(imageBytes); } } public static void main(String[] args) throws IOException { String base64File = "base64_image.txt"; String outputPath = "restored.jpg"; convertBase64FileToImage(base64File, outputPath); System.out.println("圖片還原成功!"); } }
截圖如下:
再者如果是通過接口傳輸,無需這樣子
考慮通過 HTTP 請求(如前端用 POST)傳遞 Base64 字符串,而非硬編碼在 Java 文件中
到此這篇關(guān)于Java實(shí)現(xiàn)在線圖片URL轉(zhuǎn)換為Base64以及反向解析成圖片的文章就介紹到這了,更多相關(guān)Java在線URL轉(zhuǎn)Base64內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot跨域Access-Control-Allow-Origin實(shí)現(xiàn)解析
這篇文章主要介紹了SpringBoot跨域Access-Control-Allow-Origin實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Java隨機(jī)生成驗(yàn)證碼的實(shí)現(xiàn)示例
這篇文章主要介紹Java隨機(jī)生成驗(yàn)證碼的實(shí)現(xiàn)方法,文中有相關(guān)的實(shí)現(xiàn)代碼供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2023-08-08關(guān)于SpringBoot整合Canal數(shù)據(jù)同步的問題
大家都知道canal是阿里巴巴旗下的一款開源工具,純java開發(fā),支持mysql數(shù)據(jù)庫,本文給大家介紹SpringBoot整合Canal數(shù)據(jù)同步的問題,需要的朋友可以參考下2022-03-03Spring Cloud實(shí)現(xiàn)提供API給客戶端的方法詳解
這篇文章主要給大家介紹了關(guān)于Spring Cloud實(shí)現(xiàn)提供API給客戶端的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01項(xiàng)目打包成jar后包無法讀取src/main/resources下文件的解決
本文主要介紹了項(xiàng)目打包成jar后包無法讀取src/main/resources下文件的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Java中l(wèi)ist.foreach()和list.stream().foreach()用法詳解
在Java中List是一種常用的集合類,用于存儲一組元素,List提供了多種遍歷元素的方式,包括使用forEach()方法和使用Stream流的forEach()方法,這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist.foreach()和list.stream().foreach()用法的相關(guān)資料,需要的朋友可以參考下2024-07-07Java編程實(shí)現(xiàn)軌跡壓縮算法開放窗口實(shí)例代碼
這篇文章主要介紹了Java編程實(shí)現(xiàn)軌跡壓縮算法開放窗口實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-11-11Java實(shí)現(xiàn)猜數(shù)字小游戲詳解流程
猜數(shù)字是興起于英國的益智類小游戲,起源于20世紀(jì)中期,一般由兩個(gè)人或多人玩,也可以由一個(gè)人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來用Java把這個(gè)小游戲?qū)懗鰜砭毦毷?/div> 2021-10-10最新評論