BufferedImage缓冲区大小错误

问题描述:

我从C++获取图像数据,并且我想使用JNI将它传递给Java。 我的代码如下:BufferedImage缓冲区大小错误

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 in my code)等于10000.

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

+0

每个int四个字节? – EJP

+0

是的,我在32位Linux平台上 – Flot2011

+0

另外,它是Java,所以它总是4个字节。 – Flot2011

我的问题解决了,当我用另一种颜色类型,TYPE_4BYTE_ABGR,而不是TYPE_INT_ARGB。我看不出它如何影响一个缓冲区大小,因为两者都是,根据文档:

an image with 8-bit RGBA color components 

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