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>
その他の、あまり好まれていない解決策は次のとおりです(これは、ここで言及した最初の解決策です):グーグルで検索した後、このページを見つけました- 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>