BASE64Decoder decoder = new BASE64Decoder();
byte[] b = decoder.decodeBuffer(imgStr);
// ... 處理負數字節 ...
InputStream input = new ByteArrayInputStream(b);
BufferedImage bufImg = ImageIO.read(input); // 返回 null,無異常
`ImageIO.read(InputStream)` 要求流支持 `mark`/`reset`(以便多圖片插件嘗試解碼),但 `ByteArrayInputStream` 默認支持 mark,**前提是流位置在開頭**。若在此之前已讀取過流(如調試打印、其他解析),位置已移動,`ImageIO` 讀取時從當前位置開始,導致無法識別文件頭(Magic Number),返回 `null` 而不拋異常。
InputStream input = new ByteArrayInputStream(b);
input.reset(); // ByteArrayInputStream 支持 reset 到 mark(0) 處
BufferedImage bufImg = ImageIO.read(input);
try {
bufImg = ImageIO.read(input);
} catch (IIOException e) {
// 記錄具體原因:格式不支持、文件截斷、魔數錯誤
logger.error("ImageIO 解碼失敗", e);
}
ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(b));
bufImg = ImageIO.read(iis); // 內部自動處理 mark/reset
// 寫入臨時文件,用圖片查看器/識別工具驗證
Files.write(Paths.get("test.png"), b);
// 或在線工具:base64.guru, base64-image.de
byte[] b = Base64.getDecoder().decode(imgStr); // 無需舊 BASE64Decoder
try (InputStream is = new ByteArrayInputStream(b)) {
bufImg = ImageIO.read(is);
}
**關鍵:`ImageIO.read` 靜默返回 `null` 是為了兼容多格式嘗試;調試時必讀 `ImageIO.getImageReaders` 或捕獲 `IIOException` 定位真因。**