2017-03-06 6 views
0

私はOpenIMAJライブラリを使用しています。これは "JPEG"と "PNG"ファイルではうまくいきますが、tiffファイルではエラーになります。ここOpenIMAJライブラリはtiffファイルを読み取れませんか?

import org.openimaj.image.ImageUtilities; 
import org.openimaj.image.MBFImage; 

.... 

File file = new File("/home/mosab/Desktop/input/tif.tif"); 
MBFImage input = ImageUtilities.readMBF(file); 

とエラーされています:

Exception in thread "main" java.io.IOException: org.apache.sanselan.ImageReadException: Tiff: unknown compression: 7 
    at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:189) 
    at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:126) 
    at org.openimaj.image.ImageUtilities.readMBF(ImageUtilities.java:355) 
    at org.mosab.TestOpenIMAJ.TestKmeans.main(TestKmeans.java:49) 
Caused by: org.apache.sanselan.ImageReadException: Tiff: unknown compression: 7 
    at org.apache.sanselan.formats.tiff.datareaders.DataReader.decompress(DataReader.java:135) 
    at org.apache.sanselan.formats.tiff.datareaders.DataReaderStrips.readImageData(DataReaderStrips.java:96) 
    at org.apache.sanselan.formats.tiff.TiffImageParser.getBufferedImage(TiffImageParser.java:505) 
    at org.apache.sanselan.formats.tiff.TiffDirectory.getTiffImage(TiffDirectory.java:163) 
    at org.apache.sanselan.formats.tiff.TiffImageParser.getBufferedImage(TiffImageParser.java:441) 
    at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1264) 
    at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1163) 
    at org.apache.sanselan.Sanselan.getBufferedImage(Sanselan.java:1136) 
    at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:187) 
    ... 3 more 

これは、TIFFファイルは、(特にのGeoTiff)である私が使用しています:ここでは、コードです

"https://drive.google.com/file/d/0ByKaCojxzNa9MWxPTUJjZURHR1E/view?usp=sharing"

OpenIMAJライブラリがtiff形式/ GeoTiffをサポートしていないことを意味しますか?

私はOpenIMAJがtiffをサポートしていないと思いますので、そのファイルを読むために "TwelveMonkeys"ライブラリを試しました。 "TwelveMonkeys"ライブラリを単独で/単独でファイルを読むことができます。したがって、私はOpenIMAJと一緒に働くためにTwelveMonkeysライブラリをインポートしたので、TIFFファイルをサポートしていましたが、TIFFファイルでは機能しましたが、そのファイルでは機能しませんでした。(TwelveMonkeysは別のプロジェクトで単独で読むことができました)私はそれが周り26メガバイトあるので、何かがファイルのサイズに関連している可能性が検出されたエラーメッセージを追跡し、私はエラーが法に由来することに気づいたとき

Exception in thread "main" java.io.IOException: Resetting to invalid mark 
at java.io.BufferedInputStream.reset(BufferedInputStream.java:448) 
at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:185) 
at org.openimaj.image.ExtendedImageIO.read(ExtendedImageIO.java:126) 
at org.openimaj.image.ImageUtilities.readMBF(ImageUtilities.java:355) 
at org.mosab.TestOpenIMAJ.TestKmeans.main(TestKmeans.java:49) 

後に「読み取り」:この例外が発生しました私はそれが最大のサイズを使用すると思う "org.openimaj.image.ExtendedImageIO"のクラス10mb

public static BufferedImage read(InputStream input) throws IOException { 
    if (input == null) { 
     throw new IllegalArgumentException("input == null!"); 
    } 

    final NonClosableInputStream buffer = new NonClosableInputStream(input); 
    buffer.mark(10 * 1024 * 1024); // 10mb I think here is the problem 

    BufferedImage bi; 
    try { 
     bi = readInternal(buffer); 
    } catch (final Exception ex) { 
     bi = null; 
    } 

    if (bi == null) { 
     buffer.reset(); 
     try { 
      bi = Sanselan.getBufferedImage(buffer); 
     } catch (final Throwable e) { 
      throw new IOException(e); 
     } 
    } 

    return bi; 
} 

OpenIMAJでこの問題を解決し、そのTIFFファイルを読むにはどうすればよいですか(OpenIMAJには、機能をさらに適用するために、クラスタリング/セグメンテーションのような機能があります)?

+0

TIFFファイルの画像データは圧縮できます。 TIFF形式はさまざまな圧縮方法をサポートしています。どうやら(エラーメッセージに従って)使用しているライブラリは、読みたいTIFFファイルで使用されている特定の圧縮方法をサポートしていません。 – Jesper

+1

@Jesper返信いただきありがとうございます。しかし、 "TwelveMonkeys"ライブラリはすべてのtiffファイルを読み込むことができます。私はOpenIMAJに基づいて "TwelveMonkeys"ライブラリをプロジェクトにインポートしました。それらにOpenIMAJ関数を適用します。なぜなら、OpenIMAJが許可するものよりも大きいので、それはそれを扱うことができないからです。私はOpenIMAJのチームは、制限、すなわち10MBのバッファのサイズを取り除くべきだと思います。 –

+0

TIFF圧縮7は[( "新しいスタイル")JPEG](http://www.awaresystems.be/imaging/tiff/tifftags/compression.html)です。 TwelveMonkeys ImageIOはそれらを読むことができ、JAI ImageIOもそうだと思います。 – haraldK

答えて

0

TIFFは、ライブラリによって常にサポートされているわけではない多くのカスタム拡張があるため、ひどいフォーマットです。 OpenIMAJは、さまざまな種類の画像を読み込むために異なるライブラリのバッチを使用することによって、これらの問題のいくつかを回避しようとしますが、この場合は失敗します。あなたが気づいたように、問題を引き起こしている10MBのバッファ制限があります.100MBに増やすと、リンクしたイメージがロードされます。私はこれに対処するためにコードを更新します(これは唯一の制限であるため、基になるバッファはずっと小さくなっているので、問題は発生しません)。迅速な回避策として

新しいスナップショットが展開されるまで、あなたがこれにリンクされた画像をロードすることができますSanselanはしていないようです別の問題があるように思われる

MBFImage img = ImageUtilities. 
    createMBFImage(Sanselan.getBufferedImage(new File("tif.tif")), false); 

は、すべてのイメージを読み込むことができます(未知のイメージ圧縮を参照するスタックトレースに基づいて)。そのような画像へのリンクをGitHubのバグレポート(https://github.com/openimaj/openimaj/issues/119)で提供できるのであれば、そのような画像にTwelveMonkeysを使用するフォールバックをコード化することができます。または、新しいバージョンのSanselanがその問題を修正するかどうかを確認できます。もう一度、その間にコード内の画像にTwelveMonkeysを直接使用し、上記のようにImageUtilitiesを使用してMBFImageに変換することができます。

+0

回避策 "ImageUtilities.createMBFImage"がうまくいきました! –

関連する問題