我想在我的项目中读取图像( .png文件),我也希望它能在可运行的.jar文件中工作。 所以我写了这么一小段代码:
try { InputStream in; in = Loader.class.getClassLoader().getResourceAsstream("buttons.png"); System.out.println(in.read() + ",Reader: " + in); BufferedImage img = ImageIO.read(in); System.out.println(img.getHeight()); in.close(); } catch (IOException e) { e.printstacktrace(); }
当我运行它时,我得到以下输出:
137,Reader: java.io.BufferedInputStream@15db9742 Exception in thread "main" java.lang.NullPointerException at test.Loader.load(Loader.java:21) at test.MainTest.main(MainTest.java:6)
我的MainTest只是运行这个代码,所以我不会在这里包含它。
我已经testing过,如果您可能已经注意到InputStream为null 。 因为它显然不是我的文件的path是正确的。 我的问题是:为什么ImageIO.read()返回null ?
从Cygwin启动python IDLE时,tkinter中的tcl_error
dynamic数组可以用作Windowscallback函数的参数吗?
在另一个程序/脚本中实时使用Sysinternals Process Monitor的输出
pipe道batch file输出到Python脚本
如何处理需要交互式响应的可执行文件?
我怎样才能获得系统的玻璃颜色?
Windows 7本机查找.NET ListView
COM接口指针如何与实现类相关联?
错误C2065:'DWORD_PTR':未声明的标识符
你的代码的问题是在将它传递给ImageIO.read(..) (你正在读第一个字节)之前从它读取的行:
System.out.println(in.read() + ",Reader: " + in);
当你从流中读取一个字节时,这个字节被“消耗掉”,不会被再次读取,因此ImageIO永远不会看到这个字节,导致文件格式(PNG)不被识别。 在这种情况下, ImageIO.read(..)将返回null 。
该文件似乎存在,因为in不是null 。 而您打印的值137实际上是PNG签名的第一个字节,这意味着该文件很好,并且正确地包含在您的JAR中。
如果您确实需要在传递到ImageIO之前先查看流中的字节,则可以执行如下操作:
in.mark(256); // allows you to read up to 256 bytes before calling reset() System.out.println(in.read() + ",Reader: " + in); // or whatever you like to do in.reset(); // "rewind" to beginning of stream (prevIoUs mark)
只需要小心,因为不是所有的流都支持mark()/reset()方法(可以使用boolean markSupported()方法测试)。
由于您在调用ImageIO.read之前已经在InputStream上读取,可能会发生该函数无法正确解码图像的情况。 删除对in.read()的调用,并测试调用的结果。
https://docs.oracle.com/javase/8/docs/api/javax/imageio/ImageIO.html#read-javax.imageio.stream.ImageInputStream-
ImageIO.read(...)如果无法解码图像,则可能返回null。 检查这种情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。