2017-09-18 4 views
0

Hallo ich habe ein Problem mit meinen 4-Bit-Datenpuffer zu WritableRaster konvertieren. Bildauflösung: 1024x768 (786432)BufferedImage von 4-Bit-Datenpuffern

Hier ist die Beschreibung, was ich tue.

1) Erstellen 4-Bit-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) Get Byte-Array von Databuffer von 4-Bit-

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

3) Jetzt habe ich BufferedImage aus diesem Byte-Array Pixeldata

erstellen möchten
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); 

Problem ist, wenn ich Raster.createInterleavedRaster anrufen. Ausnahme: java.awt.image.RasterFormatException: Data array too small (should be > 786431)

Ich habe auch versucht, so etwas wie diese

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

Aber dies gibt mir ähnlich failure:
java.lang.ArrayIndexOutOfBoundsException: 393216

Könnte jemand mir einen Tip geben oder zeigt die richtigen Wie setze ich diese 4-Bit pixelData auf WriteableRaster?

+1

Für eine bessere Hilfe früher, Posten [MCVE] oder [Kurz, Self Contained, Korrekt Beispiel] (http://www.sscce.org/). –

Antwort

0

gelöst. Ich hatte gerade WritableRaster zu schaffen mit ihm SampleModel geben:
SampleModel sm = MY_BIT_4_COLOR_MODEL.createCompatibleSampleModel(width, height); WritableRaster wr = Raster.createWritableRaster(sm, buffer, new Point(0,0));

0

Der erste Code, den Sie fast gearbeitet hatte, das einzige Problem ist, dass Sie versucht, eine „verschachtelte“ Raster zu erstellen. Bei Palettenbildern (IndexColorModel) haben Sie normalerweise nur ein Sample (den Palettenindex) pro Pixel, so dass keine Samples zu verschachteln sind.

Stattdessen Ihre Pixeldaten 4 Bit/Pixel, wie zwei Pixel pro Byte gespeichert. Speichern mehr Proben pro Speichereinheit, wird oft als "verpackt" bezeichnet. Dies bedeutet, dass Sie ein "gepacktes" Raster mit einer der Methoden Raster.createPackedRaster erstellen müssen.

Hier ist ein vollständiges, fahrbares Beispiel:

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); 
    }