2010-11-20 111 views
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) 

如果能夠改善,我接受,當然建議,但總的來說它按預期工作。

回答

10

setPixels假設圖像數據是而不是打包。所以它正在尋找一個長度爲image.width * image.height * 3的輸入,並在數組的末尾運行。

以下是三種解決問題的方法。

(1)解壓縮imgbytes,使其延長3倍,並按上述方法進行。

(2)手動從imgbytes加載,而不是使用setPixels緩衝器:

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

(3)不使用createDataBuffer;如果你已經知道你的數據具有正確的格式,你可以自己創建適當的緩衝(在這種情況下,DataBufferInt):

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

(你可能需要做imgbytes.clone,如果你的原件可能會被什麼東西得到突變其他)。

+0

我試過這些解決方案,但要麼我得到不相關的垃圾或黑屏。如果我查看它的十六進制轉儲,數據是正確的。你能提供一個實際從imgbytes到BufferedImage的短片段嗎?這將非常感謝:) – viraptor 2010-11-26 19:21:04

+0

如果你可以提供代碼,在你的例子中創建'圖像',當然。或者,如果您不關心數據如何進入,我會創建一個不是來自圖像的示例。 – 2010-11-26 20:22:35

+0

這是我從Xorg直接獲得的自定義對象。如果你可以用已知的'height','width'和每個像素的4個字節組件(RGB order + 1byte padding)或單個int(相同格式)的數組來完成,我可以計算出其餘部分。我失敗的部分可能是緩衝區<->柵格交互(我甚至不確定是否需要這兩者)。非常感謝。 – viraptor 2010-11-26 20:31:30