que estoy tratando de conseguir un BufferedImage a partir de muestras crudas, pero me da excepciones en tratar de leer más allá del rango de datos disponibles que yo simplemente no entiendo. Lo que estoy tratando de hacer es:Como crear un BufferedImage de datos en bruto
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)
Desafortunadamente me sale:
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)
Los datos son RGB estándar con 1 byte de relleno (de modo que 1 píxel == 4 bytes) y el tamaño de la imagen es 1366x24 px.
Finalmente obtuve el código para ejecutar con la sugerencia a continuación. El código final es:
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)
Si se puede mejorar, estoy abierto a sugerencias, por supuesto, pero en general funciona como se esperaba.
me trataron esas soluciones, pero tampoco me sale basura no relacionado, o una pantalla en negro. Los datos son correctos si miro el volcado hexadecimal. ¿Podría proporcionar un pequeño fragmento que realmente pase de imgbytes a BufferedImage? Sería muy apreciado :) – viraptor
Si puede proporcionar el código que crea 'imagen' en su ejemplo, seguro. O si no le importa cómo ingresan los datos, crearé un ejemplo que no sea de una imagen. –
Ese es un objeto personalizado que recibo directamente de Xorg. Si puede hacerlo cuando se conoce la altura característica '' width' y una serie de componentes bien 4 byte (orden RGB + 1 byte de relleno), o int única (el mismo formato) por cada píxel, puedo imaginar el resto. La parte donde fallo es probablemente la interacción de trama <-> de buffer (ni siquiera estoy seguro de si se necesitan ambas). Muchas gracias. – viraptor