You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中无法正确解码Base64 MIME图片为字节数组(Selenium测试场景)

解决Base64解码PNG时的IDAT解压错误问题

我之前碰到过几乎一模一样的问题,你的情况大概率是从src属性拿到的Base64字符串里藏着URL编码的换行符(就是你示例里的%0A),这些字符不属于Base64的有效字符集,直接解码会导致字节数组损坏,生成的PNG自然打不开。

先看你当前的代码:

String base64Source = LocalDriverManager.get().findElement(By.xpath("//img[@class='qr-code']")).getAttribute("src");
String base64Image = base64Source.split(",")[1];
byte[] decoded = Base64.getMimeDecoder().decode(base64Image);
try (OutputStream stream = new FileOutputStream("QR_CODE.png")){
 stream.write(decoded);
}

你拆分出来的base64Image里包含%0A(URL编码后的换行),Base64解码器根本认不出%这类字符,解码后的字节流直接出错,这就是PNG提示“IDAT解压错误”的原因。

修复方案

只需要在Base64解码前,先给base64Image做一次URL解码,把URL编码的字符还原成原始的Base64格式:

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;

// ... 你的原有代码逻辑
String base64Source = LocalDriverManager.get().findElement(By.xpath("//img[@class='qr-code']")).getAttribute("src");
String base64Image = base64Source.split(",")[1];
// 新增URL解码步骤,还原原始Base64字符串
String decodedBase64 = URLDecoder.decode(base64Image, StandardCharsets.UTF_8);
byte[] decoded = Base64.getMimeDecoder().decode(decodedBase64);
try (OutputStream stream = new FileOutputStream("QR_CODE.png")){
 stream.write(decoded);
}

为什么在线转换器能成功?

很多在线Base64转图片工具会自动处理URL编码字符,悄悄把%0A这类转义符还原成换行,所以你用在线工具能正常转换,但代码里没做这一步就会出问题。

修改后再运行代码,生成的PNG应该就能正常打开了,之后也可以用ZXing顺利解析QR码内容。

内容的提问来源于stack exchange,提问作者turbotramp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:38:12