2017-09-18 24 views
0

こんにちは私の4ビットデータバッファをWritableRasterに変換する際に問題があります。 画像解像度:1024x768(786432)4ビットデータバッファのBufferedImage

ここに私がしていることが記載されています。

1))4ビットのBufferedImage

bit4Image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY, MY_BIT_4_COLOR_MODEL); 
Graphics graphics = bit4Image.getGraphics(); 
graphics.drawImage(originalImage, 0, 0, null); 
graphics.dispose(); 
//4-bit BufferedImage created. 4-bit BufferedImage is properly made cause it can be saved to hdd and looks good 

2を作成し

byte[] pixelData = ((DataBufferByte) bit4Image.getRaster().getDataBuffer()).getData(); 
// pixelData length is 393216 

3)今、私はピクセルデータ

このバイト配列からBufferedImageを作成したい4ビットからのDataBufferからバイト配列を取得します。
BufferedImage dest = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY, MY_BIT_4_COLOR_MODEL); 
DataBufferByte buffer = new DataBufferByte(pixelData, pixelData.length); 
WritableRaster raster = Raster.createInterleavedRaster(buffer, width, height, width, 1, new int[]{0}, new Point(0, 0)); 
dest.setData(raster); 

Raster.createInterleavedRasterに問題があります。例外: java.awt.image.RasterFormatException: Data array too small (should be > 786431)

私もこの

BufferedImage dest = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY, MY_BIT_4_COLOR_MODEL); 
dest.getRaster().setDataElements(0, 0, width, height, pixelData); 

のようなものを試してみました。しかしこの1つは私に似て、障害を与える:
java.lang.ArrayIndexOutOfBoundsException: 393216

誰かが私にヒントを与えるか、適切に示すことができましたこの4ビットのpixelDataをWritableRasterに設定する方法は?

+1

、[MCVE]または[ショート、自己完結、正しい例](http://www.sscce.org/)を投稿してください。 –

答えて

0

解決済み。 は、私はちょうどそれをされたSampleModelを与えてWritableRasterを作成する必要がありました:
SampleModel sm = MY_BIT_4_COLOR_MODEL.createCompatibleSampleModel(width, height); WritableRaster wr = Raster.createWritableRaster(sm, buffer, new Point(0,0));

0

あなたはほとんど働いていた初期のコード、あなたは「インターリーブされた」ラスタを作成しようとする問題のみを。パレット画像(IndexColorModel)の場合、通常、ピクセルあたり1つのサンプル(パレットインデックス)しか持たないため、インターリーブするサンプルはありません。

代わりに、ピクセルデータは4ビット/ピクセルで、1バイトあたり2ピクセルとして保存されます。記憶装置ごとにより多くのサンプルを格納することは、しばしば「パックされた」と呼ばれます。つまり、Raster.createPackedRasterメソッドの1つを使用して、「パック」ラスタを作成する必要があります。ここで

がいっぱい、runableサンプルです:早いほど良いヘルプについて

public static void main(String[] args) { 
     int width = 100; 
     int height = 100; 

     // Create initial 4 bit image 
     IndexColorModel icm = new IndexColorModel(4, 16, new int[16], 0, false, -1, DataBuffer.TYPE_BYTE); 
     BufferedImage bit4Image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY, icm); 

     // ...you probably do something in between here 

     // Get the pixel data 
     byte[] pixelData = ((DataBufferByte) bit4Image.getRaster().getDataBuffer()).getData(); 

     // ...you probably do something in between here 

     // Create a data buffer around the array, wrap in raster 
     DataBufferByte buffer = new DataBufferByte(pixelData, pixelData.length); 
     WritableRaster raster = Raster.createPackedRaster(buffer, width, height, 4, null); 

     // Finally create a copy of the image, sharing pixel data 
     BufferedImage copy = new BufferedImage(icm, raster, icm.isAlphaPremultiplied(), null); 
     System.out.println("copy: " + copy); 
    } 
関連する問題