2017-02-28 5 views
0

可能であれば別のスレッドに画像を読み込み、画像が読み込まれている間にいくつかの画像寸法のスタブを表示したいのですが、最後に画像自体を表示したいと思います。Java:最初にイメージディメンションを取得するにはどうすればよいですか?

ここで私はhttps://stackoverflow.com/a/1560052/258483イメージ全体を読み取らずに寸法を読み取る方法を見つけました。

ここで、この寸法を取りたい場合は、作業をやり直してこの作業を続け、最終的にBufferedImageを達成したくないのですが?

+1

読者は 'readImage(null)'または 'read(0)'を試したことがありますか? –

+0

はい、私は論理を理解していません。なぜ私は読者を反復すべきですか?それは多くの読者が何ですか?イメージが別のリーダで利用可能な間に次元が1つの読者で利用可能である可能性はありますか? – Dims

+0

また、このリーダーはその入力から取得されましたが、なぜ私はImageReader#setInputを呼び出す必要がありますか?なぜそれは自動的に設定されませんか? – Dims

答えて

0

バックグラウンド読み取りを実装し、寸法をできるだけ早く報告し、バックグラウンドで画像を読み続ける方法の1つです。あなたのコメントからの質問に答えることをしようとする

  • あなたは読者を反復処理する必要はありません。以下のコードは、指定されたフォーマットを読み取ることができるリーダーが少なくとも1人いるかどうかをテストし、それを使用して読み取りを試みます。最初の何らかの方法で失敗した場合は、次のリーダーを試してみることもできます。しかし、これを行うためのロジックは非常に複雑で、普通はゼロまたは1つのリーダーしかないので通常は必要ありません。
  • 理論的には、1人の読者が寸法を読み取ってイメージの読取りに失敗する可能性があります。しかし、上記のように、これは一般的なケースではありません。その寸法を知らなくても、画像データを読み取ることは通常不可能です。
  • ImageReaderインスタンスは再利用可能ですが(スレッドセーフではないため、スレッド間で共有しないでください)、さまざまな入力を(同じ形式で)読み込むために使用できます。したがって、これはAPIのパフォーマンス上の考慮事項です。あなたはまた、ファイル名に基づいて読者を得ることができます。その場合、とにかく入力をどうにかして渡す必要があります。

リンクされた回答のコードを理解していれば、コードは自明であるはずです。

public class BackgroundImageReader implements Callable<BufferedImage> { 

    private final Object input; 

    public BackgroundImageReader(File input) { 
     this.input = input; 
    } 

    public BackgroundImageReader(InputStream input) { 
     this.input = input; 
    } 

    @Override 
    public BufferedImage call() throws IOException { 
     try (ImageInputStream stream = ImageIO.createImageInputStream(input)) { 
      Iterator<ImageReader> readers = ImageIO.getImageReaders(stream); 

      if (readers.hasNext()) { 
       ImageReader reader = readers.next(); 

       try { 
        reader.setInput(stream); 

        updateImageDimensions(new Dimension(reader.getWidth(0), reader.getHeight(0))); 

        return reader.read(0); 
       } finally { 
        reader.dispose(); 
       } 
      } 
      throw new IOException("Could not read image"); 
     } 
    } 

    public void updateImageDimensions(Dimension dimension) { 
     // TODO: Implement callback mechanism 
    } 
} 
関連する問題