【问题标题】:BufferedImage wrong buffer sizeBufferedImage 缓冲区大小错误
【发布时间】:2016-02-22 08:09:08
【问题描述】:

我正在从 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 的缓冲区的大小(我的代码中的 pixels 变量) 是所需的 4 倍。有人可能会说GetArrayLength 返回的是多个元素,而不是字节,但是当我使用jbytearray 时,它应该与字节数相同。无论如何,我不应该得到例外。但我愿意。

示例

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

new BufferedImage(100,100, TYPE_INT_ARGB)

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

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

【问题讨论】:

  • 是的,我在 32 位 Linux 平台上
  • 另外,它是Java,所以总是4个字节。

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


【解决方案1】:

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

an image with 8-bit RGBA color components

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

【讨论】:

    猜你喜欢
    • 2018-09-19
    • 2021-09-30
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2014-06-10
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多