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


    一、简介

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

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

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

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

    二、maven依赖

    pom.xml

    
    <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.0modelVersion>
        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.6.0version>
            <relativePath/> 
        parent>
        
        <groupId>com.aliangroupId>
        <artifactId>ImageToBase64artifactId>
        <version>0.0.1-SNAPSHOTversion>
        <name>ImageToBase64name>
        <description>图片和Base64之间的相互转化description>
    
        <properties>
            <java.version>1.8java.version>
        properties>
        
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starterartifactId>
            dependency>
        dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                plugin>
            plugins>
        build>
    
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    三、工具类

    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();
                }
            }
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

      图片和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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    运行结果:

    ----------------------------图片转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
    
    • 1
    • 2
    • 3
    • 4

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

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

  • 相关阅读:
    尚硅谷webpack5笔记2
    RabbitMQ之延迟队列解读
    【Linux系统编程】进程程序替换、exec系列替换函数
    基于Dijkstra、A*和动态规划的移动机器人路径规划(Matlab代码实现)
    易基因|TSD物种全基因组DNA甲基化模式对孵育性别和过去孵育温度的响应 | 性别决定
    vue.js中使用三元运算符设置动态样式
    H2数据库--转载
    【云原生 · Kubernetes】Taint和Toleration(污点和容忍)
    学习笔记-RCE
    算法通过村第十一关黄金挑战——位运算如何实现压缩储存
  • 原文地址:https://blog.csdn.net/Alian_1223/article/details/126387898