Java实现图片和Base64之间的相互转化

一、简介

  工作中调用第三方接口的时候,比如(人脸识别,身份证识别,文字识别等等)有时是图片,有时是Base64的字符串,一般前端上传的都是图片,我们有时就需要进行相应的转换了。

  • 图片转Base64字符串
  • Base64字符串转图片

  我们也写一个工具类,完成这两个转化,需要注意的是,本文中的版本:

  • Spring Boot 的版本是2.6.0
  • JDK 环境为 1.8

二、maven依赖

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <groupId>com.alian</groupId>
    <artifactId>ImageToBase64</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ImageToBase64</name>
    <description>图片和Base64之间的相互转化</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

三、工具类

ImageUtil.java

package com.alian.imagetobase64.utils;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Base64;

public class ImageUtil {

    /**
     * 图片转Base64字符串
     * @param imageFileName
     * @return
     */
    public static String convertImageToBase64Str(String imageFileName) {
        ByteArrayOutputStream baos = null;
        try {
            //获取图片类型
            String suffix = imageFileName.substring(imageFileName.lastIndexOf(".") + 1);
            //构建文件
            File imageFile = new File(imageFileName);
            //通过ImageIO把文件读取成BufferedImage对象
            BufferedImage bufferedImage = ImageIO.read(imageFile);
            //构建字节数组输出流
            baos = new ByteArrayOutputStream();
            //写入流
            ImageIO.write(bufferedImage, suffix, baos);
            //通过字节数组流获取字节数组
            byte[] bytes = baos.toByteArray();
            //获取JDK8里的编码器Base64.Encoder转为base64字符
            return Base64.getEncoder().encodeToString(bytes);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (baos != null) {
                    baos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * Base64字符串转图片
     * @param base64String
     * @param imageFileName
     */
    public static void convertBase64StrToImage(String base64String, String imageFileName) {
        ByteArrayInputStream bais = null;
        try {
            //获取图片类型
            String suffix = imageFileName.substring(imageFileName.lastIndexOf(".") + 1);
            //获取JDK8里的解码器Base64.Decoder,将base64字符串转为字节数组
            byte[] bytes = Base64.getDecoder().decode(base64String);
            //构建字节数组输入流
            bais = new ByteArrayInputStream(bytes);
            //通过ImageIO把字节数组输入流转为BufferedImage
            BufferedImage bufferedImage = ImageIO.read(bais);
            //构建文件
            File imageFile = new File(imageFileName);
            //写入生成文件
            ImageIO.write(bufferedImage, suffix, imageFile);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (bais != null) {
                    bais.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

  图片和Base64之间的相互转化我代码的解释已经很清楚了,有兴趣的可以仔细看看,我们这里并没有引用大篇幅的依赖获取其他的工具类,都是基于已有的环境实现。

四、测试

  简单写个main方法测试下

    public static void main(String[] args) {
        System.out.println("----------------------------图片转Base64字符串---------------------------");
        //图片文件路径
        String imageFileName = "C:\\myFile\\CSDN\\imageToBase64\\csdn.jpg";
        //图片转Base64字符串
        String base64Str = ImageUtil.convertImageToBase64Str(imageFileName);
        System.out.println(base64Str);

        System.out.println("----------------------------Base64字符串转图片---------------------------");
        //新文件路径
        String newFileName = "C:\\myFile\\CSDN\\imageToBase64\\csdn-new.jpg";
        //Base64字符串转图片
        ImageUtil.convertBase64StrToImage(base64Str, newFileName);
        System.out.println("生成的文件的路径是:"+newFileName);
    }

运行结果:

----------------------------图片转Base64字符串---------------------------
/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEAAQADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA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g6XcSOSzPNZxuWJ5JJI61Rb4deDXJJ8M6YpP9y3Vf5UAfK1B45NfU4+G/g0HP/CO2JHo0eR+Rq5beDPC1m6vbeG9JideQ6WUYYfjjNAHy5o+hat4hkCaPptzfZON8KZRT/tOflX8SK9k8EfByHTZotR8StFdXSEPFZx/NFGfVyR85HHH3Qc/e4I9bAAAAAAHQCnUAFfM3xk1CKb4l3kck0atbW8MGC2MDb5n/tQ19M1E1vC7FmhjZj1JUEmgD4rlu4UhdlmiLBSQN45NfZ2m2i6fpVnZL923gSIfRVA/pUv2W3/594v++BU1ABXn3xou47X4a3iO4Q3Fxbxgk46Sq5/RDXoNMeNJF2uqsOuGGaAPiz7Vb/8APeL/AL7Fe0fs/ojyeIrlGVwRbRgqQcY80n+Yr2j7Lb/88Iv++BTkijiB2IqZ67RigCSiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9k=
----------------------------Base64字符串转图片---------------------------
生成的文件的路径是:C:\myFile\CSDN\imageToBase64\csdn-new.jpg

效果图
在这里插入图片描述

  从上图的标注上我们可以看到生成的图片变大了,这是因为当把数据进行Base64编码后,生成的数据会比原数据大三分之一。关于Base64编码还有不懂的,可以参考我另外一篇文章:Java实现Base64工具类(编码和解码)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值