2016-06-01 4 views
3

現在、単純なint []配列のグレースケール値は0〜255です。単純なイメージファイルに値を保存します。私は次のようにします:Java:グレースケールのint配列をイメージに保存

// flatten the 2d array 
int[] result = Arrays.stream(imgData) 
    .flatMapToInt(Arrays::stream) 
    .toArray(); 

BufferedImage outputImage = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY); 
outputImage.setRGB(0, 0, w, h, result, 0, w); 
ImageIO.write(outputImage, INPUT_FILETYPE, new File(getOutputFileSystemString())); 

これは実際にはうまくいきますが、画像は暗く暗いです。

ここにIrfanViewの画像があります。あなたは実際に詳細を見ることができます、それはすべて黒ではありませんが、それは非常に暗いです。私は255に左上隅にすべてのprixelを設定し、それはまだ非常に暗いですが、少なくとも私の意見では白であるべき輪郭を見ることができます:

http://i.imgur.com/nkiy2Hv.png

誰もがなぜ知っていますか?私はあなたがWritableRasterを使用して、より良い運を持っていると信じ

+0

imgDataの種類は何ですか? 2次元int []? – ManoDestra

+1

@ManoDestraはい。これは0から255のint値を含み、ちょうどint [1024] [1024]のサイズです。 – luuksen

+0

あなたは 'result'という配列を作成しますが、関数呼び出しでは' source'を使用します –

答えて

2

BufferedImage outputImage = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY); 
WritableRaster raster = outputImage.getRaster(); 
raster.setSamples(0, 0, w, h, 0, result); 
ImageIO.write(outputImage, INPUT_FILETYPE, new File(getOutputFileSystemString())); 
1

あなたはWritableRasterを使用することができます(とのgetRGBを忘れて、それはピクセルにアクセスするための最悪の方法です):

int[] myarray = ... 
WritableRaster wr = image.getRaster() ; 
for (int y=0, nb=0 ; y < image.getHeight() ; y++) 
    for (int x=0 ; x < image.getWidth() ; x++, nb++) 
     wr.setSample(x, y, 0, myarray[nb]) ; 

にですDataBufferを使用する方が速いですが、イメージエンコーディングを処理する必要があります。

関連する問題