如果你想創建一個從本地代碼的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的轉換。 –