9
我試圖從原始樣本中獲取BufferedImage,但是我試圖讀取超出可用數據範圍的例外情況,這些數據範圍我只是不明白。我正在試圖做的是:如何從原始數據創建BufferedImage
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)
不幸的是我得到:
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)
的數據爲標準的RGB 1個字節的填充(使1個像素== 4個字節)和圖像尺寸是1366x24像素。
我終於得到了代碼運行下面的建議。最後的代碼是:
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)
如果能夠改善,我接受,當然建議,但總的來說它按預期工作。
我試過這些解決方案,但要麼我得到不相關的垃圾或黑屏。如果我查看它的十六進制轉儲,數據是正確的。你能提供一個實際從imgbytes到BufferedImage的短片段嗎?這將非常感謝:) – viraptor 2010-11-26 19:21:04
如果你可以提供代碼,在你的例子中創建'圖像',當然。或者,如果您不關心數據如何進入,我會創建一個不是來自圖像的示例。 – 2010-11-26 20:22:35
這是我從Xorg直接獲得的自定義對象。如果你可以用已知的'height','width'和每個像素的4個字節組件(RGB order + 1byte padding)或單個int(相同格式)的數組來完成,我可以計算出其餘部分。我失敗的部分可能是緩衝區<->柵格交互(我甚至不確定是否需要這兩者)。非常感謝。 – viraptor 2010-11-26 20:31:30