Domanda

Sto cercando di ottenere una BufferedImage da campioni grezzi, ma ottengo eccezioni di cercare di leggere oltre la gamma di dati disponibili che io proprio non capisco. Quello che sto cercando di fare è:

val datasize = image.width * image.height
val imgbytes = image.data.getIntArray(0, datasize)
val datamodel = new SinglePixelPackedSampleModel(DataBuffer.TYPE_INT, image.width, image.height, Array(image.red_mask.intValue, image.green_mask.intValue, image.blue_mask.intValue))
val buffer = datamodel.createDataBuffer
val raster = Raster.createRaster(datamodel, buffer, new Point(0,0))
datamodel.setPixels(0, 0, image.width, image.height, imgbytes, buffer)
val newimage = new BufferedImage(image.width, image.height, BufferedImage.TYPE_INT_RGB)
newimage.setData(raster)

Purtroppo ottengo:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 32784
    at java.awt.image.SinglePixelPackedSampleModel.setPixels(SinglePixelPackedSampleModel.java:689)
    at screenplayer.Main$.ximage_to_swt(Main.scala:40)
    at screenplayer.Main$.main(Main.scala:31)
    at screenplayer.Main.main(Main.scala)

I dati sono standard RGB con 1 imbottitura byte (in modo che 1 pixel == 4 byte) e la dimensione dell'immagine è 1366x24 px.


Alla fine ho ottenuto il codice per eseguire con il suggerimento di seguito. Il codice finale è:

val datasize = image.width * image.height
val imgbytes = image.data.getIntArray(0, datasize)

val raster = Raster.createPackedRaster(DataBuffer.TYPE_INT, image.width, image.height, 3, 8, null)
raster.setDataElements(0, 0, image.width, image.height, imgbytes)

val newimage = new BufferedImage(image.width, image.height, BufferedImage.TYPE_INT_RGB)
newimage.setData(raster)

Se può essere migliorato, io sono aperto a suggerimenti, naturalmente, ma in generale funziona come previsto.

È stato utile?

Soluzione

setPixels presuppone che i dati immagine è non imballato. Quindi è alla ricerca di un input di lunghezza image.width * image.height * 3, e scappare alla fine della matrice.

Qui ci sono tre opzioni per come risolvere il problema.

(1) imgbytes Disimballare quindi è 3x più lungo, e lo fa allo stesso modo come sopra.

(2) caricare manualmente il buffer dalla imgbytes anziché utilizzare setPixels:

var i=0
while (i < imgbytes.length) {
  buffer.setElem(i, imgbytes(i))
  i += 1
}

(3) Non utilizzare createDataBuffer; se si sa già che i dati ha la corretta formattazione è possibile creare l'adeguato buffer di te stesso (in questo caso, un DataBufferInt):

val buffer = new DataBufferInt(imgbytes, imgbytes.length)

(potrebbe essere necessario fare imgbytes.clone se la copia originale potrebbe ottenere mutato da qualcos'altro).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top