将 Base64 编码的图像写入文件

Posted

技术标签:

【中文标题】将 Base64 编码的图像写入文件【英文标题】:Write Base64-encoded image to file 【发布时间】:2014-01-19 16:56:07 【问题描述】:

如何?

我已使用 Base64 将图像编码为字符串。 首先,我读取文件,然后将其转换为字节数组,然后应用 Base64 编码将图像转换为字符串。

现在我的问题是如何解码。

byte dearr[] = Base64.decodeBase64(crntImage);
File outF = new File("c:/decode/abc.bmp");
BufferedImage img02 = ImageIO.write(img02, "bmp", outF); 

变量crntImage 包含图像的字符串表示形式。

【问题讨论】:

【参考方案1】:

假设图像数据已经是你想要的格式,你根本不需要图像ImageIO——你只需要将数据写入文件:

// Note preferred way of declaring an array variable
byte[] data = Base64.decodeBase64(crntImage);
try (OutputStream stream = new FileOutputStream("c:/decode/abc.bmp")) 
    stream.write(data);

(我假设您在这里使用的是 Java 7 - 如果没有,您将需要编写手动 try/finally 语句来关闭流。)

如果图像数据不是您想要的格式,您需要提供更多详细信息。

【讨论】:

我使用了你上面的代码。我正在开发 java web 服务,我正在获取上传图像形式的 ios 设备的 base64 字符串。当我在单独的应用程序中尝试您的上述代码时,我得到了原始图像。但是当我尝试使用 Web 服务时,没有创建图像。当我在这两种情况下调试应用程序时,相同base64字符串的字节数组长度不同。为什么我会遇到这个问题。 @Aniket:这并没有为我们提供几乎足够的信息来帮助您。我建议你问一个新的问题,包括更多的上下文——网络服务是什么,它是如何实现的,你如何上传图像数据,你观察到了什么等等。 我在下面的链接***.com/questions/27378069/…发布了问题 "我假设您使用的是 Java 7" => 您的意思是 Java 8,而不是 Java 7。Afaik Base64 和 try-with-resources 都是 Java 8。 @Toto:不,try-with-resources 肯定是在 Java 7 中:docs.oracle.com/javase/7/docs/technotes/guides/language/…Java 8 在我写这个答案时没有发布,尽管我猜它在 beta 中可用。但是 OP 使用的 Base64 类也不是 JDK 中的类。 (它没有decodeBase64 方法。)【参考方案2】:

使用 Java 8 的 Base64 API

byte[] decodedImg = Base64.getDecoder()
                    .decode(encodedImg.getBytes(StandardCharsets.UTF_8));
Path destinationFile = Paths.get("/path/to/imageDir", "myImage.jpg");
Files.write(destinationFile, decodedImg);

如果您的编码图像以 data:image/png;base64,iVBORw0... 之类的开头,则必须删除该部分。请参阅this answer,了解一种简单的方法。

【讨论】:

【参考方案3】:

无需使用 BufferedImage,因为您已经将图像文件保存在字节数组中

    byte dearr[] = Base64.decodeBase64(crntImage);
    FileOutputStream fos = new FileOutputStream(new File("c:/decode/abc.bmp")); 
    fos.write(dearr); 
    fos.close();

【讨论】:

【参考方案4】:
import java.util.Base64;

....只是明确表示此答案使用 java.util.Base64 包,而不使用任何第三方库。

String crntImage=<a valid base 64 string>

byte[] data = Base64.getDecoder().decode(crntImage);

try( OutputStream stream = new FileOutputStream("d:/temp/abc.pdf") ) 

   stream.write(data);

catch (Exception e) 

   System.err.println("Couldn't write to file...");

【讨论】:

【参考方案5】:

使用 apache-commons 的其他选项:

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;

...
File file = new File( "path" );
byte[] bytes = Base64.decodeBase64( "base64" );
FileUtils.writeByteArrayToFile( file, bytes );

【讨论】:

【参考方案6】:

试试这个:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;

public class WriteImage 
   
    public static void main( String[] args )
    
        BufferedImage image = null;
        try 

            URL url = new URL("URL_IMAGE");
            image = ImageIO.read(url);

            ImageIO.write(image, "jpg",new File("C:\\out.jpg"));
            ImageIO.write(image, "gif",new File("C:\\out.gif"));
            ImageIO.write(image, "png",new File("C:\\out.png"));

         catch (IOException e) 
            e.printStackTrace();
        
        System.out.println("Done");
    

【讨论】:

OP 没有 URL。他们有 base64 中的图像数据-您的答案完全忽略了这一点。

以上是关于将 Base64 编码的图像写入文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将 base64 编码的图像保存到磁盘?

python:将base64编码的png图像转换为jpg

使用 IOUtils 和 ImageIO 写入图像文件有啥区别

从 Expo 的缓存中以 base64 格式读取文件,写入 Firebase 存储(Cloud Storage for Firebase)

来自GrayScale的Ruby + RMagick + base64图像+ RGB转换不起作用

如何在 Java 中加速读写 base64 编码的 gzip 大文件