我从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。
为什么?我错过了什么(可能很明显)?
答案 0 :(得分:0)
当我使用其他颜色类型 TYPE_4BYTE_ABGR
而不是 TYPE_INT_ARGB
时,我的问题就解决了。根据文档记载,我无法看到它如何影响缓冲区大小,
an image with 8-bit RGBA color components
但是我现在得到了正确的缓冲区大小。 我将尝试进行更多调查,并在找到解释后发布更新。