我遇到了在我的java应用程序中加载 J2K图像文件(jp2,jp2000)的问题。奇怪的是,当它作为独立的Java应用程序(或在测试中)运行时,应用程序正确运行(文件已成功从磁盘读取)。
在Tomcat应用程序服务器上部署后, ImageIO.read(..) 方法每次都返回null。
任何帮助都是适当的。
希蒙
答案 0 :(得分:1)
更新:在审核了@haraldK的评论之后 - 第https://github.com/haraldk/TwelveMonkeys页(在网络应用中部署插件部分)中详细描述了该解决方案。
您需要在web.xml中定义侦听器:
<web-app ...>
...
<listener>
<display-name>ImageIO service provider loader/unloader</display-name>
<listener-class>com.twelvemonkeys.servlet.image.IIOProviderContextListener</listener-class>
</listener>
...
</web-app>
您还需要将此Maven依赖项添加到项目中:
<dependency>
<groupId>com.twelvemonkeys.servlet</groupId>
<artifactId>servlet</artifactId>
<version>3.0.2</version>
</dependency>
其他不太喜欢的解决方案是(这是我在这里提到的第一个解决方案): 在做了一些谷歌搜索后,我找到了这个页面 - https://blog.idrsolutions.com/2013/03/getting-jai-jpeg2000-to-run-on-glassfish-server-without-a-npe/,它描述了J2K imageio服务提供商在使用诸如glassfish或tomcat之类的应用服务器时的解决问题。
根据这篇文章,解决方案很简单。只需直接使用阅读器:
public BufferedImage getJPEG2000Image(byte[] data){
ImageInputStream iis = null;
BufferedImage image=null;
try {
iis = ImageIO.createImageInputStream(new ByteArrayInputStream(data));
com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReaderSpi j2kImageReaderSpi = new com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReaderSpi();
com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReader j2kReader = new com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReader(j2kImageReaderSpi);
j2kReader.setInput(iis, true);
image = j2kReader.read(0, new com.sun.media.imageio.plugins.jpeg2000.J2KImageReadParam());
}
catch (Exception e){
e.printStackTrace();
}
return image;
}
还需要Maven依赖:
<dependency>
<groupId>com.sun.media</groupId>
<artifactId>jai_imageio</artifactId>
<version>1.1</version>
</dependency>