2017-12-08 8 views
1

グレースケール値を含む.csvファイルをBufferedImageを使用してイメージに変換しようとしています。 最初にcsvはpixArray[]に読み込まれ、すべての値は2倍になります。グレースケール値を.csvからBufferedImageに変換する

私はコード

   BufferedImage image = new BufferedImage(width,height,BufferedImage. 
        TYPE_BYTE_GRAY); 
      for(int x = 0; x < width; x++) 
      { 
       for(int y = 0; y < height; y++) 
       { 
        image.setRGB(x, y, (int)Math.round(pixArray[y])); 
       } 
      } 

      File file_out = new File("output.png"); 
      try { 
       ImageIO.write(image, "png", file_out); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

で100x100px出力画像を作成するためにBufferedImageを使用しようとしていますが、私は出力として持っているすべては、100x100の黒い四角です。

私はTYPE_BYTE_GRAYの代わりに、outoutのpng形式だけでなく、このエラーを生成しているものを見つけることができませんでした。

+0

入力データのサンプルを表示します。値が '0.0 <= x <= 1'の場合、' Math.round() 'はすべてをゼロに切り詰めて黒くなります。 –

+0

値はすべて0 <= x <= 255 最初は「111.8884 \t 112.2339 \t 113.4165」のように読み込まれます。 丸めを取り除いてみましたが、 'int'キャストを維持したまま、出力としてすべて黒を受け取りました。 – gorringe

+1

次のようにするべきではありません: 'int g =(int)Math.round(pixArray [y]); image.setRGB(x、y、new Color(g、g、g).getRGB());私はアルファをピクセル値に設定し、カラーコンポーネントはすべてゼロにしていると思います。 –

答えて

1

それはする必要があります

int g = (int)Math.round(pixArray[y]); 
image.setRGB(x,y,new Color(g,g,g).getRGB()); 

何あなたの現在のコードは、ピクセル値にアルファを設定することが、色成分すべてゼロを残しているやっています。

0

代替ソリューションを転記してください。ジムの答えは正しいものの、動作しますが、サンプル値をグレースケールBufferedImageに入れるのに最も遅い方法の1つです。

BufferedImageTYPE_BYTE_GRAYは、すべての変換をRGBカラーとする必要はありません。なぜなら、過剰な使い捨てColorインスタンスを作成する

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); 
WritableRaster raster = image.getRaster(); 

for (int y = 0; y < height; y++) { 
    int value = (int) Math.round(pixArray[y]) 

    for (int x = 0; x < width; x++) { 
     raster.setSample(x, y, 0, value); 
    } 
} 

*)遅いが、ほとんど起因する色空間への変換に/から:画像に直接グレー値を配置するには、画像のラスタを通してそれを行いますsRGBカラースペース。 100x100の画像ではあまり目立たないかもしれませんが、1000x1000以上を試してみると分かります。

PS:内側のループでxをループするようにループを再配置しました。これは通常、データのローカリティと最新のCPUのキャッシングのために、値を読み取るときに通常は高速になります。あなたの場合は、主に、各行の値を計算(丸め、キャスト)するだけで済むからです。

関連する問題