0

我面临在我的 java 应用程序中加载J2K 图像文件(jp2、jp2000)的问题。奇怪的是,当应用程序作为独立的 java 应用程序(或在测试中)运行时,它运行正确(文件从磁盘成功读取)。

在 Tomcat 应用服务器上部署后,ImageIO.read(..)方法每次都返回 null。

任何帮助都会得到帮助。

西蒙

4

1 回答 1

1

更新:在查看了来自@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>
于 2015-03-30T16:01:37.950 回答