2017-05-28 11 views
0

short[]で表される生のグレースケール画像ピクセルがあります。 BufferedImageを作成してPNG形式で保存したいと思います。これまでのところカスタムBufferedImageの保存

short[] myRawImageData; 

// Create signed 16 bit data buffer, and compatible sample model 
DataBuffer dataBuffer = new DataBufferShort(myRawImageData, w * h); 
SampleModel sampleModel = new ComponentSampleModel(DataBuffer.TYPE_SHORT, w, h, 1, w, new int[] {0}); 

// Create a raster from sample model and data buffer 
WritableRaster raster = Raster.createWritableRaster(sampleModel, dataBuffer, null); 

// Create a 16 bit signed gray color model 
ColorSpace colorSpace = ColorSpace.getInstance(ColorSpace.CS_GRAY); 
ColorModel colorModel = new ComponentColorModel(colorSpace, false, false, Transparency.OPAQUE, DataBuffer.TYPE_SHORT); 

// Finally create the signed 16 bit image 
BufferedImage image = new BufferedImage(colorModel, raster, colorModel.isAlphaPremultiplied(), null); 

try (FileOutputStream fos = new FileOutputStream("/tmp/tst.png")) { 
    ImageIO.write(image, "png", fos);// <--- Here goes the exception 
} catch (Exception ex) { 
    ex.printStackTrace(); 
} 

とても良いが、私は、私はArrayIndexOutOfBoundsExceptionを取得していPNGとして保存するImageIO.writeを使用しようとしているとき:なしTYPE_SHORT_GRAY私は自分自身をこのように1を作成していBufferedImageのために定義が存在しないので 。

+0

a)あなたの問題を[MCVE]として示すコードを投稿し、b)何が起こるか、起こりそうなこと、それらがどのように異なっているか、そして特定のエラーが発生したことを説明する必要があります。 – pvg

答えて

0

あなたのコードはうまく動作しますが、私がエラーを出す唯一の方法はbandOffsetsを変更したときでした。あなたのコードをもっと教えてください。

編集 データセットにマイナスのデータがある場合、おそらくshortの代わりにushortを使用しているはずです。

int h = 64, w = 64; 
    short[] myRawImageData = new short[4096]; 
    for (int i = 0; i < 4096; i++){ 
     //this rolls over into negative numbers 
     myRawImageData[i] = (short) (i * 14); 
    } 

    // Create signed 16 bit data buffer, and compatible sample model 
    DataBuffer dataBuffer = new DataBufferUShort(myRawImageData, w * h); 
    SampleModel sampleModel = new ComponentSampleModel(DataBuffer.TYPE_USHORT, w, h, 1, w, new int[] {0}); 

    // Create a raster from sample model and data buffer 
    WritableRaster raster = Raster.createWritableRaster(sampleModel, dataBuffer, null); 

    // Create a 16 bit signed gray color model 
    ColorSpace colorSpace = ColorSpace.getInstance(ColorSpace.CS_GRAY); 
    ColorModel colorModel = new ComponentColorModel(colorSpace, false, false, Transparency.OPAQUE, DataBuffer.TYPE_USHORT); 

    // Finally create the signed 16 bit image 
    BufferedImage image = new BufferedImage(colorModel, raster, colorModel.isAlphaPremultiplied(), null); 

    try (FileOutputStream fos = new FileOutputStream("/tmp/tst.png")) { 
     ImageIO.write(image, "png", fos);// <--- Here goes the exception 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

これは、マイナスの値がガマットの明るい半分であると想定していることを前提としています。

+0

まだ素晴らしい作品です。おそらく入力データが問題です。 –

+0

入力データに負の数値が含まれています。あなたもですか? – JobNick

+0

負の数を追加するとエラーが表示されます。 –

関連する問題