在Tomcat中读取J2K不起作用

时间:2015-03-30 16:01:38

标签: liferay tomcat7 javax.imageio jai jpeg2000

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

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

任何帮助都是适当的。

希蒙

1 个答案:

答案 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>