BufferedImage错误的缓冲区大小

时间:2015-11-19 23:46:50

标签: java c++ image java-native-interface indexoutofboundsexception

我从c ++获取图像数据,我想使用JNI将其传递给Java。 我的代码如下:

jclass bitmap_class = (jclass) env->FindClass("java/awt/image/BufferedImage");
jclass raster_class = (jclass) env->FindClass("java/awt/image/WritableRaster");
jclass data_class = (jclass) env->FindClass("java/awt/image/DataBufferByte");
jmethodID constructor = env->GetMethodID(bitmap_class, "<init>", "(III)V");

int w = nativeFrame->Width();
int h = nativeFrame->Height();
int t = 2; // That is TYPE_INT_ARGB
jobject bitmap = env->NewObject(bitmap_class, constructor, w, h, t);//byteType);

jmethodID getRaster = env->GetMethodID(bitmap_class, "getRaster", "()Ljava/awt/image/WritableRaster;");
jobject raster = env->CallObjectMethod(bitmap, getRaster);

 jmethodID getDataBuffer = env->GetMethodID(raster_class, "getDataBuffer", "()Ljava/awt/image/DataBuffer;");
 jobject dataBuffer = env->CallObjectMethod(raster, getDataBuffer);

 jmethodID getData = env->GetMethodID(data_class, "getData", "()[B");
 jobject pixelsObject = env->CallObjectMethod(dataBuffer, getData);

 jbyteArray pixels = (jbyteArray)pixelsObject;
 long sz = env->GetArrayLength(pixels);

 env->SetByteArrayRegion(pixels, (jsize)0, (jsize)nativeFrame->BufferSize(),  (jbyte*) nativeFrame->GetData());

当我创建与c ++图像具有相同大小和颜色格式的BufferedImage时,我希望它具有相同大小的缓冲区。

然而,在获得 java.lang.ArrayIndexOutOfBoundsException 后,我开始调查并发现BufferedImage缓冲区的大小(像素我的代码中的变量) 少4倍 然后需要。可以说GetArrayLength返回了许多元素,而不是字节,但是当我使用jbytearray时,它应该与多个字节相同。无论如何,我不应该得到例外。但我知道。

示例

对于100x100 32bpp图像,我的c ++图像缓冲区大小正确为100 * 100 * 4 = 40000,但是当我打电话时

new BufferedImage(100,100, TYPE_INT_ARGB)

我得到缓冲区大小(我的代码中 sz )等于10000。

为什么?我错过了什么(可能很明显)?

1 个答案:

答案 0 :(得分:0)

当我使用其他颜色类型 TYPE_4BYTE_ABGR 而不是 TYPE_INT_ARGB 时,我的问题就解决了。根据文档记载,我无法看到它如何影响缓冲区大小,

an image with 8-bit RGBA color components

但是我现在得到了正确的缓冲区大小。 我将尝试进行更多调查,并在找到解释后发布更新。