Java — BufferedImage неправильный размер буфера

Я получаю данные изображения из c ++, и я хочу передать их в Java с помощью JNI.
Мой код выглядит следующим образом:

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());

Как я создаю BufferedImage того же размера и цветового формата, что и изображение c ++, я ожидаю, что он будет иметь буфер такого же размера.

Однако после получения java.lang.ArrayIndexOutOfBoundsException Я начал расследование и обнаружил, что размер BufferedImageБуфер пикселей переменная в моем коде) В 4 раза меньше тогда нужно. Можно сказать, что GetArrayLength возвращает количество элементов, не байтов, а как я использую jbytearray, он должен быть таким же, как количество байтов. Во всяком случае, я не должен получить исключение. Но я делаю.

пример

Для изображения 100×100 32bpp мой буфер изображений c ++ имеет правильный размер 100 * 100 * 4 = 40000, но когда я звоню

new BufferedImage(100,100, TYPE_INT_ARGB)

Я получаю размер буфера (С.З. в моем коде) равно 10000.

Это почему? Что (вероятно, очевидно) я пропускаю?

1

Решение

Моя проблема была решена, когда я использовал другой тип цвета, TYPE_4BYTE_ABGR вместо TYPE_INT_ARGB. Я не могу понять, как это может повлиять на размер буфера, так как оба, согласно документации:

an image with 8-bit RGBA color components

Однако сейчас я получаю правильный размер буфера.
Я попытаюсь исследовать больше и опубликую обновление, когда найду объяснение.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]