我面临在我的 java 应用程序中加载J2K 图像文件(jp2、jp2000)的问题。奇怪的是,当应用程序作为独立的 java 应用程序(或在测试中)运行时,它运行正确(文件从磁盘成功读取)。
在 Tomcat 应用服务器上部署后,ImageIO.read(..)方法每次都返回 null。
任何帮助都会得到帮助。
西蒙
我面临在我的 java 应用程序中加载J2K 图像文件(jp2、jp2000)的问题。奇怪的是,当应用程序作为独立的 java 应用程序(或在测试中)运行时,它运行正确(文件从磁盘成功读取)。
在 Tomcat 应用服务器上部署后,ImageIO.read(..)方法每次都返回 null。
任何帮助都会得到帮助。
西蒙
更新:在查看了来自@haraldK 的评论后 - 该解决方案在页面https://github.com/haraldk/TwelveMonkeys(在 Web 应用程序中部署插件部分)中得到了很好的描述。
您需要在 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/描述了使用 glassfish 或 tomcat 等应用服务器时 J2K imageio 服务提供者的解析问题。
根据这篇文章,解决方案很简单。直接使用阅读器即可:
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>