如果你想创建一个从本地代码的Java位图对象,你应该做这样的事情:
在本机代码
读你的缓冲区,然后应用每个像素的缓冲溶液,以ARGB格式,如果你有RGBA,你可以做这样的事情:
int a = 0xFF & yourPixelInt;
int r = 0xFF & yourPixelInt >> 24;
int g = 0xFF & yourPixelInt >> 16;
int b = 0xFF & yourPixelInt >> 8;
unsigned int newPixel = (a << 24) | (r << 16) | (g << 8) | (b)
做它所有的像素从RGBA到ARGB转换,在这之后,你可以创建本地代码的Java位图:
jint* bytes = env->GetIntArrayElements(array, NULL);
if (bytes != NULL) {
memcpy(bytes, buffer, origBufferSize * sizeof (unsigned int));
env->ReleaseIntArrayElements(array, bytes, 0);
}
jclass bitmapClass = env->FindClass("android/graphics/Bitmap");
jmethodID methodid = env->GetStaticMethodID(bitmapClass, "createBitmap", "([IIIIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");
jclass bitmapConfig = env->FindClass("android/graphics/Bitmap$Config");
jfieldID argb8888FieldID = env->GetStaticFieldID(bitmapConfig, "ARGB_8888",
"Landroid/graphics/Bitmap$Config;");
jobject argb8888Obj = env->GetStaticObjectField(bitmapConfig, argb8888FieldID);
jobject java_bitmap = env->CallStaticObjectMethod(bitmapClass, methodid, array, 0, bitmapwidth, bitmapwidth, bitmapheight, argb8888Obj);
不要忘了释放物体以避免内存泄漏
env->DeleteLocalRef(array);
env->DeleteLocalRef(bitmapClass);
env->DeleteLocalRef(bitmapConfig);
env->DeleteLocalRef(argb8888Obj);
如何将它保存到SD卡作为.jpg并再次读取它? –
这可能是解决方案,但我不确定移动设备是否适合为流视频保存帧 – 4ntoine
通常,流式视频涉及YUV缓冲区。 YUV到RGBA的转换非常昂贵(与软件h264解码器使用的CPU资源顺序相同,远远超过运行硬件解码器所花费的时间)。使用renderscript或OpenGL可以改善YUV到RGB的转换。 –