Java 在线图片 URL 转换为 Base64 以及反向解析成图片

前言

🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF

爬虫神器,无代码爬取,就来:bright.cn

Java基本知识:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

1. 基本知识

Base64 是一种将二进制数据编码为 ASCII 字符串格式的方法,常用于在网络中安全传输图片、文件等内容

  • 编码后只包含 [A-Za-z0-9+/=],适合在文本协议中传输

  • 编码后的内容比原始内容大约多出 33% 的体积

  • 常用于 HTML <img src="data:image/jpeg;base64,..."> 中内嵌图片、邮件传输、JWT 等

在线图片 URL -> 下载图片内容 -> 转为字节数组 -> Base64 编码

  1. 利用 java.net.URL 获取网络资源
  2. 用 InputStream 读取图片数据
  3. 使用 Base64.getEncoder().encodeToString() 进行编码

但是Base64是无法转化为在线链接的,只能解析成图片下载下来而已!

类型能否转化说明
URL → Base64✅ 可以直接读取资源,转为字节数组后编码
Base64 → URL❌ 不行必须先上传至某个图床或服务器获取新 URL

基本的转化过程可以通过在线网址:https://www.toolhelper.cn/Image/Base64?tab=image

2. Demo

在线Url转化为Base64的Demo如下:(只需要替换链接即可)

import java.io.*;
import java.net.URL;
import java.util.Base64;

public class ImageUtils {

    /**
     * 在线图片 URL 转为 Base64 字符串
     * @param imageUrl 图片的在线地址
     * @return Base64 编码字符串
     * @throws IOException 网络异常或读取失败
     */
    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]; // 缓冲区
            int bytesRead;
            while ((bytesRead = is.read(buffer)) != -1) {
                baos.write(buffer, 0, bytesRead);
            }

            // 获取字节数组并进行 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 编码结果:" + base64);
    }
}

截图如下:

在这里插入图片描述

将 Base64 字符串保存为本地图片文件(无法执行):

import java.io.*;
import java.util.Base64;

public class Base64ToImage {

    /**
     * 将 Base64 编码字符串转为图片并保存本地
     * @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("图片已保存至本地");
    }
}

截图如下:

在这里插入图片描述

是因为 Java 中字符串字面量的最大长度为 65,535 个字符(字符数,不是字节数)。而一整段 Base64 编码很容易超过这个限制,尤其是图片

可以保存在外部文件中,然后通过 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 内容
        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 文件中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值