Java 如何从原始数据创建BuffereImage

Java 如何从原始数据创建BuffereImage,java,scala,awt,bufferedimage,Java,Scala,Awt,Bufferedimage,我试图从原始样本中获取一个BuffereImage,但在试图读取超出可用数据范围的数据时出现异常,我就是不理解。我想做的是: val datasize = image.width * image.height val imgbytes = image.data.getIntArray(0, datasize) val datamodel = new SinglePixelPackedSampleModel(DataBuffer.TYPE_INT, image.width, image.heigh

我试图从原始样本中获取一个BuffereImage,但在试图读取超出可用数据范围的数据时出现异常,我就是不理解。我想做的是:

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)
数据是带有1字节填充的标准RGB(因此1像素==4字节),图像大小为1366x24 px


我终于得到了下面的建议运行的代码。最后的代码是:

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)

如果可以改进的话,我当然愿意接受建议,但总的来说,它可以按预期工作。

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
}

(如果您的原始副本可能会被其他东西变异,您可能需要执行
imgbytes.clone

我尝试了这些解决方案,但要么得到了无关的垃圾,要么出现了黑屏。如果我查看它的十六进制转储,数据是正确的。你能提供一个从imgbytes到buffereImage的短片段吗?非常感谢:)如果您能在示例中提供创建
图像的代码,当然可以。或者,如果您不关心数据是如何进入的,我将创建一个不是来自图像的示例。这是一个直接从Xorg获得的自定义对象。如果您可以使用已知的
高度
宽度
和每个像素4字节组成的数组(RGB顺序+1字节填充)或单个int(相同格式),那么我可以计算出其余部分。我失败的部分可能是bufferraster交互(我甚至不确定两者是否都需要)。非常感谢。好的-我成功了(问题中包含了代码)。除非能以某种方式简化这个问题——请随意更正:)经过两周的努力寻找类似这样的信息,我很高兴找到这个问题。谢谢你的提问和回答!
val buffer = new DataBufferInt(imgbytes, imgbytes.length)