2015-11-19 3 views
1

Я получаю данные изображения из C++, и я хочу передать его на Java с помощью JNI. Мой код выглядит следующим образом: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()); 

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

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

Пример

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

new BufferedImage(100,100, TYPE_INT_ARGB) 

Я получаю размер буфера (sz в моем коде) соответствует 10000.

Почему это? Что (возможно, очевидно), я не хватает?

+0

Четыре байта на int? – EJP

+0

да, я на 32-битной платформе Linux – Flot2011

+0

Кроме того, это Java, поэтому он всегда 4 байта. – Flot2011

ответ

0

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

an image with 8-bit RGBA color components 

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

Смежные вопросы