java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java图片与Base64互转

Java图片与Base64互转工具类实现过程

作者:J_liaty

本文介绍了Java中实现图片与Base64编码转换的工具类,包括本地图片转Base64编码、网络图片转Base64编码、Base64编码转图片文件等功能,工具类使用了Java标准库和Apache Commons库,通过Java NIO实现高效的文件操作,感兴趣的朋友跟随小编一起看看吧

一、需求分析与技术选型

在实际开发中,经常需要处理图片与Base64编码之间的转换,以及图片文件的上传操作。本工具类将实现以下功能:

  1. 将本地图片文件转换为Base64编码
  2. 将网络图片转换为Base64编码
  3. 将Base64编码转换为图片文件并保存到本地
  4. 支持自定义保存的文件名称

技术依赖

Maven依赖

<dependencies>
    <!-- Apache Commons IO -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.11.0</version>
    </dependency>
    <!-- Apache Commons Codec -->
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.15</version>
    </dependency>
</dependencies>

二、工具类设计与实现

package com.example.util;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.UUID;
/**
 * 图片与Base64互转工具类
 */
public class ImageBase64Utils {
    /**
     * 将本地图片文件转换为Base64编码
     *
     * @param filePath 图片文件路径
     * @return Base64编码字符串
     * @throws IOException 文件读取异常
     */
    public static String localImageToBase64(String filePath) throws IOException {
        File file = new File(filePath);
        return localImageToBase64(file);
    }
    /**
     * 将本地图片文件转换为Base64编码
     *
     * @param file 图片文件对象
     * @return Base64编码字符串
     * @throws IOException 文件读取异常
     */
    public static String localImageToBase64(File file) throws IOException {
        if (file == null || !file.exists()) {
            throw new IllegalArgumentException("文件不存在");
        }
        byte[] fileContent = FileUtils.readFileToByteArray(file);
        return Base64.encodeBase64String(fileContent);
    }
    /**
     * 将网络图片转换为Base64编码
     *
     * @param imageUrl 图片URL地址
     * @return Base64编码字符串
     * @throws IOException 网络异常或图片读取异常
     */
    public static String networkImageToBase64(String imageUrl) throws IOException {
        try (InputStream inputStream = new URL(imageUrl).openStream()) {
            byte[] imageBytes = IOUtils.toByteArray(inputStream);
            return Base64.encodeBase64String(imageBytes);
        }
    }
    /**
     * 将Base64编码转换为图片并保存到本地(使用默认文件名)
     *
     * @param base64String Base64编码字符串
     * @param outputDir    输出目录
     * @return 保存的文件路径
     * @throws IOException 文件保存异常
     */
    public static String base64ToImage(String base64String, String outputDir) throws IOException {
        return base64ToImage(base64String, outputDir, generateRandomFileName());
    }
    /**
     * 将Base64编码转换为图片并保存到本地(自定义文件名)
     *
     * @param base64String Base64编码字符串
     * @param outputDir    输出目录
     * @param fileName     自定义文件名(不含扩展名)
     * @return 保存的文件路径
     * @throws IOException 文件保存异常
     */
    public static String base64ToImage(String base64String, String outputDir, String fileName) throws IOException {
        // 验证输入参数
        if (base64String == null || base64String.isEmpty()) {
            throw new IllegalArgumentException("Base64字符串不能为空");
        }
        if (outputDir == null || outputDir.isEmpty()) {
            throw new IllegalArgumentException("输出目录不能为空");
        }
        // 创建输出目录(如果不存在)
        Path outputPath = Paths.get(outputDir);
        if (!Files.exists(outputPath)) {
            Files.createDirectories(outputPath);
        }
        // 检测图片格式
        String fileExtension = detectImageFormat(base64String);
        String fullFileName = fileName + "." + fileExtension;
        // 构建完整文件路径
        Path filePath = outputPath.resolve(fullFileName);
        // 解码Base64并写入文件
        byte[] imageBytes = Base64.decodeBase64(base64String);
        try (InputStream inputStream = new ByteArrayInputStream(imageBytes)) {
            Files.copy(inputStream, filePath, StandardCopyOption.REPLACE_EXISTING);
        }
        return filePath.toString();
    }
    /**
     * 检测Base64字符串表示的图片格式
     *
     * @param base64String Base64编码字符串
     * @return 图片格式(如jpg, png等)
     */
    private static String detectImageFormat(String base64String) {
        if (base64String.startsWith("/9j/") || base64String.startsWith("iVBORw")) {
            return "jpg";
        } else if (base64String.startsWith("iVBORw0KGgo")) {
            return "png";
        } else if (base64String.startsWith("R0lGOD")) {
            return "gif";
        } else if (base64String.startsWith("UklGRg")) {
            return "webp";
        } else if (base64String.startsWith("Qk0")) {
            return "bmp";
        }
        // 默认返回jpg格式
        return "jpg";
    }
    /**
     * 生成随机文件名
     *
     * @return 随机文件名(不含扩展名)
     */
    private static String generateRandomFileName() {
        return UUID.randomUUID().toString();
    }
}

三、工具类详细说明

1. 本地图片转Base64编码

2. 网络图片转Base64编码

3. Base64转图片并保存

4. 辅助方法

四、使用示例

public class ImageBase64Demo {
    public static void main(String[] args) {
        try {
            // 示例1:本地图片转Base64
            String base64 = ImageBase64Utils.localImageToBase64("/path/to/local/image.jpg");
            System.out.println("Base64编码:" + base64.substring(0, 30) + "...");
            // 示例2:网络图片转Base64
            String netBase64 = ImageBase64Utils.networkImageToBase64("https://example.com/image.png");
            System.out.println("网络图片Base64:" + netBase64.substring(0, 30) + "...");
            // 示例3:Base64转图片(默认文件名)
            String savedPath1 = ImageBase64Utils.base64ToImage(base64, "/output/directory");
            System.out.println("保存路径:" + savedPath1);
            // 示例4:Base64转图片(自定义文件名)
            String savedPath2 = ImageBase64Utils.base64ToImage(netBase64, "/output/directory", "custom-image");
            System.out.println("保存路径:" + savedPath2);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

五、性能优化与注意事项

1. 性能优化

2. 异常处理

3. 安全注意事项

六、扩展功能建议

  1. 图片格式转换:在保存时支持指定输出格式
  2. 图片压缩:添加图片质量参数,支持有损压缩
  3. 水印添加:在保存前添加文字或图片水印
  4. 尺寸调整:支持输出指定尺寸的图片
  5. Base64数据URI支持:支持解析包含MIME类型的完整Base64数据URI

七、完整工具类代码(带详细注释)

package com.example.util;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.UUID;
/**
 * 图片与Base64互转工具类
 * 功能:
 * 1. 本地图片文件转Base64编码
 * 2. 网络图片转Base64编码
 * 3. Base64编码转图片文件(支持自定义文件名)
 */
public class ImageBase64Utils {
    /**
     * 将本地图片文件转换为Base64编码
     *
     * @param filePath 图片文件路径
     * @return Base64编码字符串
     * @throws IOException 文件读取异常
     */
    public static String localImageToBase64(String filePath) throws IOException {
        // 验证文件路径有效性
        if (filePath == null || filePath.trim().isEmpty()) {
            throw new IllegalArgumentException("文件路径不能为空");
        }
        File file = new File(filePath);
        return localImageToBase64(file);
    }
    /**
     * 将本地图片文件转换为Base64编码
     *
     * @param file 图片文件对象
     * @return Base64编码字符串
     * @throws IOException 文件读取异常
     */
    public static String localImageToBase64(File file) throws IOException {
        // 验证文件对象有效性
        if (file == null) {
            throw new IllegalArgumentException("文件对象不能为空");
        }
        if (!file.exists()) {
            throw new IllegalArgumentException("文件不存在: " + file.getAbsolutePath());
        }
        if (!file.isFile()) {
            throw new IllegalArgumentException("路径不是文件: " + file.getAbsolutePath());
        }
        if (!file.canRead()) {
            throw new IllegalArgumentException("文件不可读: " + file.getAbsolutePath());
        }
        // 读取文件内容并编码为Base64
        byte[] fileContent = FileUtils.readFileToByteArray(file);
        return Base64.encodeBase64String(fileContent);
    }
    /**
     * 将网络图片转换为Base64编码
     *
     * @param imageUrl 图片URL地址
     * @return Base64编码字符串
     * @throws IOException 网络异常或图片读取异常
     */
    public static String networkImageToBase64(String imageUrl) throws IOException {
        // 验证URL有效性
        if (imageUrl == null || imageUrl.trim().isEmpty()) {
            throw new IllegalArgumentException("图片URL不能为空");
        }
        try (InputStream inputStream = new URL(imageUrl).openStream()) {
            // 读取网络图片数据
            byte[] imageBytes = IOUtils.toByteArray(inputStream);
            return Base64.encodeBase64String(imageBytes);
        }
    }
    /**
     * 将Base64编码转换为图片并保存到本地(使用默认文件名)
     *
     * @param base64String Base64编码字符串
     * @param outputDir    输出目录
     * @return 保存的文件路径
     * @throws IOException 文件保存异常
     */
    public static String base64ToImage(String base64String, String outputDir) throws IOException {
        // 生成随机文件名
        return base64ToImage(base64String, outputDir, generateRandomFileName());
    }
    /**
     * 将Base64编码转换为图片并保存到本地(自定义文件名)
     *
     * @param base64String Base64编码字符串
     * @param outputDir    输出目录
     * @param fileName     自定义文件名(不含扩展名)
     * @return 保存的文件路径
     * @throws IOException 文件保存异常
     */
    public static String base64ToImage(String base64String, String outputDir, String fileName) throws IOException {
        // 验证输入参数
        if (base64String == null || base64String.trim().isEmpty()) {
            throw new IllegalArgumentException("Base64字符串不能为空");
        }
        if (outputDir == null || outputDir.trim().isEmpty()) {
            throw new IllegalArgumentException("输出目录不能为空");
        }
        if (fileName == null || fileName.trim().isEmpty()) {
            throw new IllegalArgumentException("文件名不能为空");
        }
        // 创建输出目录(如果不存在)
        Path outputPath = Paths.get(outputDir);
        if (!Files.exists(outputPath)) {
            Files.createDirectories(outputPath);
        }
        // 检测图片格式
        String fileExtension = detectImageFormat(base64String);
        String fullFileName = fileName + "." + fileExtension;
        // 构建完整文件路径
        Path filePath = outputPath.resolve(fullFileName);
        // 解码Base64并写入文件
        byte[] imageBytes = Base64.decodeBase64(base64String);
        try (InputStream inputStream = new ByteArrayInputStream(imageBytes)) {
            // 使用NIO复制文件,自动关闭资源
            Files.copy(inputStream, filePath, StandardCopyOption.REPLACE_EXISTING);
        }
        return filePath.toString();
    }
    /**
     * 检测Base64字符串表示的图片格式
     *
     * @param base64String Base64编码字符串
     * @return 图片格式(如jpg, png等)
     */
    private static String detectImageFormat(String base64String) {
        // 去除可能的Data URI前缀
        String cleanBase64 = base64String.replaceFirst("data:image/[^;]+;base64,", "");
        // 根据Base64前缀判断图片格式
        if (cleanBase64.startsWith("/9j/") || cleanBase64.startsWith("iVBORw")) {
            return "jpg";
        } else if (cleanBase64.startsWith("iVBORw0KGgo")) {
            return "png";
        } else if (cleanBase64.startsWith("R0lGOD")) {
            return "gif";
        } else if (cleanBase64.startsWith("UklGRg")) {
            return "webp";
        } else if (cleanBase64.startsWith("Qk0")) {
            return "bmp";
        }
        // 默认返回jpg格式
        return "jpg";
    }
    /**
     * 生成随机文件名
     *
     * @return 随机文件名(不含扩展名)
     */
    private static String generateRandomFileName() {
        return UUID.randomUUID().toString().replace("-", "");
    }
}

八、单元测试建议

import com.example.util.ImageBase64Utils;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.*;
class ImageBase64UtilsTest {
    @Test
    void testLocalImageToBase64(@TempDir Path tempDir) throws IOException {
        // 创建临时测试文件
        Path testFile = tempDir.resolve("test.jpg");
        Files.write(testFile, "test image content".getBytes());
        String base64 = ImageBase64Utils.localImageToBase64(testFile.toString());
        assertNotNull(base64);
        assertTrue(base64.length() > 0);
    }
    @Test
    void testBase64ToImage(@TempDir Path tempDir) throws IOException {
        String testBase64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=";
        String outputPath = tempDir.toString();
        String savedPath = ImageBase64Utils.base64ToImage(testBase64, outputPath);
        File savedFile = new File(savedPath);
        assertTrue(savedFile.exists());
        assertTrue(savedFile.length() > 0);
    }
}

九、总结

本文详细实现了Java图片与Base64互转的工具类,包含以下功能:

  1. 本地图片转Base64编码
  2. 网络图片转Base64编码
  3. Base64编码转图片文件
  4. 支持自定义文件名保存

工具类使用了Apache Commons IO和Apache Commons Codec库简化开发,通过Java NIO实现高效的文件操作。代码包含详细的注释和异常处理,可直接集成到项目中用于图片处理场景。

在实际应用中,可根据具体需求扩展以下功能:

通过本工具类,开发者可以高效地处理图片与Base64编码之间的转换,满足各种图片处理需求。

到此这篇关于Java图片与Base64互转工具类实现过程的文章就介绍到这了,更多相关Java图片与Base64互转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文