跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 关于 ImageIO.write()的奇怪 exception
未分類
25 2 月 2021

关于 ImageIO.write()的奇怪 exception

关于 ImageIO.write()的奇怪 exception

資深大佬 : fantasquex 2

在 ImageIO.write()的文档中标明会抛出 IOException,在我写一个小 project 的时候遇到抛出 IndexOutOfBoundsException 导致我的程序崩溃,于是深入调查。 最小复现程序如下:

package test;  import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream;  import javax.imageio.ImageIO;  public class MyChange {     public static void main(String[] args) {         File inputFile = new File("0.png");         try (InputStream is = new FileInputStream(inputFile)) {             BufferedImage image = ImageIO.read(is);             ImageIO.write(image, "bmp", new File("0.bmp"));         } catch (IOException e) {             e.printStackTrace();         }     } } 

输入的图片比较有特点,将任意一张图片(image.png)使用 imagemagick 做如下变换可得到触发 exception 的输入

convert image.png -colorspace gray -depth 2 -alpha off 0.png 

可以使用 mediainfo 确认 bit depth 为 2 。

这边自己生成的一个样例 https://iili.io/fm4Vna.png

经过这边的测试只有 bit depth 为 2 时会抛出这个 exception,而 bit depth 为 1,4 和 8 时都可以正常完成程序的预期功能。

测试的 openJDK 是 15.0.2,同时测试了 openJDK 11.0.10 ,欢迎大佬复现。

想请教 v 友这是 openJDK 的问题还是我对于 Java 的理解有问题,感谢!

大佬有話說 (5)

  • 資深大佬 : luozic

    BMP 文件的图像深度可选 lbit 、4bit 、8bit 及 24bit

  • 資深大佬 : luozic

    @luozic 还有 32bit,没有 2bit

  • 資深大佬 : luozic

    @luozic 还有 16bi t,目前看到的规范就确定这几种

  • 資深大佬 : codehz

    bmp 格式属于微软私有的格式,尚且没有公开的官方标准,别看它看起来简单,实际上细节很多,不同模式下存储的方法都有所不同,还有对齐的问题。。

  • 主 資深大佬 : fantasquex

    @codehz
    @luozic 我还想问一下他抛出 IndexOutOfBoundsException 我可以怎么优雅的处理,我之前的处理方法是只处理了 IOException,另外这里 jdk 抛出 IOException 会不会更好,谢谢!

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具