java8 解码以 base64 编码的图像

java8 decode image which encoded in base64

我正在尝试解码使用 java.util.Base64 (java8) 以 base64 字符串编码的图像。

这是 base64 编码的字符串:

/9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAAExAAIAAAASAAAATgAAAAAAAABgAAAAAQAAAGAAAAABUGFpbnQuTkVUIHYzLjUuMTAA/9sAQwAZERMWExAZFhQWHBsZHiU+KSUiIiVMNzotPlpQX15ZUFdWZHCQemRqiGxWV32qfoiUmaGioWF4sL2vnLuQnqGa/9sAQwEbHBwlISVJKSlJmmdXZ5qampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa/8AAEQgADAAMAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX 29/j5+v/aAAwDAQACEQMRAD8AvazJDPdraSXEcIijMoLuF+c8J19OT+VaWn3QvLGG4GPnXkDse4/OoNJ+cXUzcvJcOCfZTtA/IVny3ktje3cMG0J5u/BGcEqpP6mgD//Z

可以在http://codebeautify.org/base64-to-image-converter

上解码



当我尝试将 base64 字符串解码为字节时。我收到此错误消息:

java.lang.IllegalArgumentException: Illegal base64 character 20


这是我的代码:

String base64Str = "/9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAAExAAIAAAASAAAATgAAAAAAAABgAAAAAQAAAGAAAAABUGFpbnQuTkVUIHYzLjUuMTAA/9sAQwAZERMWExAZFhQWHBsZHiU+KSUiIiVMNzotPlpQX15ZUFdWZHCQemRqiGxWV32qfoiUmaGioWF4sL2vnLuQnqGa/9sAQwEbHBwlISVJKSlJmmdXZ5qampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa/8AAEQgADAAMAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX 29/j5+v/aAAwDAQACEQMRAD8AvazJDPdraSXEcIijMoLuF+c8J19OT+VaWn3QvLGG4GPnXkDse4/OoNJ+cXUzcvJcOCfZTtA/IVny3ktje3cMG0J5u/BGcEqpP6mgD//Z";
byte[] imageByteArray_new = Base64.getDecoder().decode(base64Str);

我不知道哪里出了问题。请帮忙,谢谢

您的编码字符串中有一个 space,这是 base64 中的非法字符。如果您删除它,它仍然会在您链接到的转换器中生成相同的图像,并且现在也可以通过您的代码进行解码。

更新:

一些解码器(如您链接的解码器,或 Java 中的 Base64.getMimeDecoder())会忽略非法字符,而其他解码器(如 Base64.getDecoder())则不允许。

当我通过 @RequestParam 收到 base64 字符串时遇到同样的问题,它收到的“+”为“”。

Base64.getDecoder().decode() 给了我同样的异常(java.lang.IllegalArgumentException:非法的 base64 字符 20) Base64.getMimeDecoder() 只是忽略了空格并保存了有错误的图像。

修正:

public byte[] convertImage(String base64) { String base64Image = base64.replaceAll(" ", "+"); return byte[] imageBytes = java.util.Base64.getDecoder().decode(base64Image); }

它对我有用。

是的,它也适用于我。非常感谢。

 String base64Image = base64.replaceAll(" ", "+");

查询 - 我会说这是临时解决方案,因为在加密字符串中,如果出现空白或任何其他字符,则它将不起作用。