2016-04-14 17 views
0

私は、BufferedImagesをピクセル単位で頻繁に処理する必要のあるプログラムを用意しています。通常、効率は私にとって気にするほど重要ではありませんが、実際には1ミリ秒ごとに取得したいと考えています。一例として、JavaでBufferedImageのピクセルをより高速に反復処理する方法はありますか?

は、今、私は画像の赤チャンネルを分離する見つけた最速の方法は、次のようになります。

int[] rgb = image.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth()); 


    for(int i = 0; i < rgb.length; i ++) 
     rgb[i] = rgb[i] & 0xFFFF0000; 

    image.setRGB(0, 0, img.getWidth(), img.getHeight(), rgb, 0, img.getWidth());   

配列を移入するために、一度画像を通じて起こっているのを意味します再度フィルタを適用し、最後にピクセルを更新するために3回目に行う。また、アルファチャンネルが0のピクセルが完全にゼロになることを考慮すると、少なくとももう一度それを通過しなければなりません。

さらに、従来のネストされたforループでは、getRGB()とsetRGB()の個々のピクセルバージョンを使用しようとしましたが、それはさらに遅くなります(ただし、int [ ])。

これは、Iterable型が解決する問題の種類ですが、イメージにその原則を適用する方法はありません。このプロジェクトでは、もしうまくいけば、 "ベストプラクティス"ではないトータルハッキングで大丈夫です。

バッファリングされたイメージの生データを反復処理する方法はありますか?あなたは、画素値への直接アクセスを持っていますが、あなたはすべてのケース/タイプを処理する必要があるため

+0

この質問はすでに回答されています。ここから開始http://stackoverflow.com/questions/1975824/fastest-way-to-compare-pixel-values-between-two-bufferedimages?rq=1そしてgo – gpasch

+1

だから私はすでに整数の色の部分をしています本当に新しいものは唯一のものですが、全体的にはパフォーマンスのためにRasterとDataBufferを覗いているはずです。もう少し具体的にできますか? – user3236716

答えて

2

最速の方法のDataBufferにアクセスすることです:

public void Test(BufferedImage img) 
    { 
    switch (img.getType()) 
     { 
     case BufferedImage.TYPE_BYTE_GRAY : 
     case BufferedImage.TYPE_3BYTE_BGR : 
      byte[] bufferbyte = ((DataBufferByte)img.getRaster().getDataBuffer()).getData() ; 
      //... 
      break ; 
     case BufferedImage.TYPE_USHORT_GRAY : 
      short[] buffershort = ((DataBuffer)img.getRaster().getDataBuffer()).getData() ; 
      //... 
      break ; 
     //Other cases 
     } 
    }