把图片转换成Base64形式存储

发布于:2024-05-21 ⋅ 阅读:(185) ⋅ 点赞:(0)

目录

1.Python代码

2.java实现

实现方式1

实现方式2:使用Base64类来实现

实现方式3:使用流的 available 这个方法

实现方式4:使用BASE64Encoder类来实现

实现方式5:使用BASE64Encoder类 + available

3.把Base64形式字符串,再转换为图片

4.其他

1.为什么不建议使用 available() 方法, 什么情况下会有问题

2.sun.misc.BASE64Encoder 是 java se 中的类吗


===============

1.Python代码

import base64

def image_to_base64(image_path):
    with open(image_path, "rb") as image_file:
        image_data = image_file.read()
        base64_data = base64.b64encode(image_data).decode('utf-8')
    return base64_data

image_path = "image.jpg"
base64_string = image_to_base64(image_path)

===

在这段代码中,我们首先定义了一个函数image_to_base64(image_path),用来将指定路径下的图片文件转换成Base64字符串。然后我们传入图片文件的路径“image.jpg”,调用这个函数将图片转换成Base64字符串,并打印输出。你可以根据实际的需求修改文件路径或者将转换后的Base64字符串进行适当的操作。

---

2.java实现

===

实现方式1

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Base64;

public class ImageToBase64 {

    public static void main(String[] args) {
        String imagePath = "image.jpg";
        String base64String = imageToBase64(imagePath);
        System.out.println(base64String);
    }

    public static String imageToBase64(String imagePath) {
        String base64String = "";
        File file = new File(imagePath);
        try (FileInputStream fileInputStream = new FileInputStream(file)) {
            byte[] bytes = new byte[(int) file.length()];
            fileInputStream.read(bytes);
            base64String = Base64.getEncoder().encodeToString(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return base64String;
    }
}

实现方式2:使用Base64类来实现

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.Base64.Encoder;

public class ImageToBase64 {

    public static void main(String[] args) {
        String imagePath = "image.jpg";
        String base64String = imageToBase64(imagePath);
        System.out.println(base64String);
    }

    public static String imageToBase64(String imagePath) {
        String base64String = "";
        File file = new File(imagePath);
        try (FileInputStream fileInputStream = new FileInputStream(file)) {
            byte[] bytes = new byte[(int) file.length()];
            fileInputStream.read(bytes);
            Encoder encoder = Base64.getEncoder();
            base64String = encoder.encodeToString(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return base64String;
    }
}

====

在这段代码中,我们使用Base64.getEncoder()方法获取一个Base64.Encoder对象,然后使用这个Encoder对象来将字节数组转换成Base64字符串。这样可以实现相同的功能,并且更加灵活。

====

实现方式3:使用流的 available 这个方法

当然可以使用available()方法来获取文件的长度,但是一般不推荐在实际生产环境中使用available()方法来获取文件长度,因为available()方法的返回值取决于操作系统和文件系统的不同,可能会导致错误的结果。更为可靠的方式是根据实际读取到的数据大小来确定字节数组的大小。

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.Base64.Encoder;

public class ImageToBase64 {

    public static void main(String[] args) {
        String imagePath = "image.jpg";
        String base64String = imageToBase64(imagePath);
        System.out.println(base64String);
    }

    public static String imageToBase64(String imagePath) {
        String base64String = "";
        File file = new File(imagePath);
        try (FileInputStream fileInputStream = new FileInputStream(file)) {
            byte[] bytes = new byte[fileInputStream.available()];
            fileInputStream.read(bytes);
            Encoder encoder = Base64.getEncoder();
            base64String = encoder.encodeToString(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return base64String;
    }
}

====

实现方式4:使用BASE64Encoder类来实现

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import sun.misc.BASE64Encoder;

public class ImageToBase64 {

    public static void main(String[] args) {
        String imagePath = "image.jpg";
        String base64String = imageToBase64(imagePath);
        System.out.println(base64String);
    }

    public static String imageToBase64(String imagePath) {
        String base64String = "";
        File file = new File(imagePath);
        try (FileInputStream fileInputStream = new FileInputStream(file)) {
            byte[] bytes = new byte[(int) file.length()];
            fileInputStream.read(bytes);
            BASE64Encoder encoder = new BASE64Encoder();
            base64String = encoder.encode(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return base64String;
    }
}

====

请注意,sun.misc.BASE64Encoder 类在 Java 9 中已被标记为不推荐使用,因为它是一个内部 API,可能在将来的版本中被移除。因此,建议您使用标准的 java.util.Base64 类来进行 Base64 编码。

===

实现方式5:使用BASE64Encoder类 + available

import sun.misc.BASE64Encoder;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class ImageToBase64 {

    public static void main(String[] args) {
        String imagePath = "image.jpg";
        String base64String = imageToBase64(imagePath);
        System.out.println(base64String);
    }

    public static String imageToBase64(String imagePath) {
        String base64String = "";
        File file = new File(imagePath);
        try (FileInputStream fileInputStream = new FileInputStream(file)) {
            int fileSize = fileInputStream.available();
            byte[] bytes = new byte[fileSize];
            fileInputStream.read(bytes);
            BASE64Encoder encoder = new BASE64Encoder();
            base64String = encoder.encode(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return base64String;
    }
}

====

你可以使用 available() 方法来获取流中可读取的字节数,但是在实际中并不推荐使用 available() 方法来确定流的大小,因为它并不总是返回精确的流大小。更好的方式是先知道文件大小,然后读取对应字节数。

==========

尽管在这个示例中使用了 available() 方法,但请注意这并不是一个稳健的做法,建议尽可能避免直接使用 available() 方法。

===

3.把Base64形式字符串,再转换为图片

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Base64;

public class Base64ImageDecoder {

    public static void main(String[] args) {
        String base64Image = "Base64字符串"; // 替换为要解码的Base64字符串

        try {
            // 解码Base64字符串
            byte[] decodedBytes = Base64.getDecoder().decode(base64Image);

            // 指定图片存储路径
            String filePath = "decoded_image.jpg"; // 存储的图片文件名和格式,例如 decoded_image.jpg

            // 将解码后的字节数组写入文件
            try (FileOutputStream outputStream = new FileOutputStream(filePath)) {
                outputStream.write(decodedBytes);
            }

            System.out.println("图片解码成功,已保存至 " + filePath);
        } catch (IOException e) {
            System.err.println("解码失败: " + e.getMessage());
        }
    }
}

===

4.其他

1.为什么不建议使用 available() 方法, 什么情况下会有问题

available() 方法用于获取流中尚未被读取的字节数,但它并不总是返回准确的值。主要原因是在大多数流的实现中,available() 方法只返回估计值,而不是精确的字节数。

以下是一些可能导致 available() 方法不准确的情况:

  1. 缓冲区大小:很多流实现会使用缓冲区来提高读取效率,available() 方法只返回缓冲区中尚未读取的字节数。如果缓冲区还有剩余数据未读取,available() 方法会返回缓冲区中的字节数,而不是整个流的大小。

  2. 网络流和管道流:对于网络流和管道流,available() 方法的返回值可能会受到网络延迟等因素的影响,不一定准确反映实际数据大小。

  3. 实现差异:不同的流实现可能对 available() 方法的行为有不同的解释,导致返回值的不确定性。

因此,为了避免潜在的问题,最好不要依赖 available() 方法来确定流的大小。最好的做法是事先知道流的大小,或者使用其他方法来准确获取流的大小,比如记录文件大小或者使用其他方式来确定流的结束标记。

===

2.sun.misc.BASE64Encoder 是 java se 中的类吗

是的,sun.misc.BASE64Encoder 是 Java SE 中的类。它是Sun Microsystems在早期版本的Java中提供的用于将数据编码为Base64格式的类。然而,需要注意的是,sun.misc.BASE64Encoder 是JDK的内部类,不是官方公开的标准API,因此在新的Java版本中可能会有变动,甚至被移除。

===

推荐的做法是使用java.util.Base64类来进行Base64编码,它是在Java 8中引入的官方 API,提供了更稳定和可靠的Base64编码功能。如果有使用Base64编码的需求,建议使用java.util.Base64类来替代 sun.misc.BASE64Encoder

===