使用JNI将图像从C++发送到Java

3
我正在尝试使用JNI从C++向Java发送图像。该图像是在C++中创建的位图,我使用GetDIBits将像素转换为char*。在使用C++将图像保存到文件时没有问题,但是在将像素发送到Java时,图像变得模糊。JavaDocs说我必须对BufferedImage使用3BYTE_BGR,但我感觉压缩出了问题。
C++位图
在Java中转换为BufferedImage时,宽度和高度也通过jni接收
这是图像的结果

图片应该是什么样子的? - Jonas Wolf
1
我投票关闭此问题,因为它没有问题。 - David Brossard
1个回答

1
考虑到bi.bitCount为32,使用3BYTE_BGR格式的BufferedImage是不正确的:它假设每三个字节有一个像素,而不是每四个字节有一个像素。相反,请使用TYPE_INT_BGR。正如我们在评论中讨论的那样,您的DataBuffer将需要是DataBufferInt,您可以通过使用ByteBuffer和IntBuffer来实现,如下面的代码片段所示:
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
IntBuffer intBuffer = ByteBuffer.wrap(img).asIntBuffer();
int[] imgInts = new int[img.length * Byte.SIZE / Integer.SIZE];
intBuffer.get(imgInts);
image.setData(Raster.createRaster(image.getSampleModel(), new DataBufferInt(imgInts, imgInts.length), new Point()));

我也考虑过这个问题,但由于我正在发送一个byte[],所以DataBuffer会抛出异常,因为我无法将DataByteBuffer强制转换为DataIntBuffer,而我确实想发送字节而不是像素整数。 - MicroHat11
你可以使用java.nio.ByteBuffer.asIntBuffer将'img'包装和重新解释为int[],然后构造所需的DataIntBuffer。 - Derek T. Jones
更新了我的答案,演示了ByteBuffer/IntBuffer的使用。 - Derek T. Jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接