2014-06-06 98 views
0

我將BMP作爲RGBA緩衝區(我可以將它保存爲本機代碼中的BMP並將其視爲.bmp圖像),我需要將它從本機代碼傳遞給android。我發現類似的問題和答案,這是解決方案之一:如何在本地代碼中使用RGBA緩衝區創建Android位圖?

  1. 在本機代碼
  2. 回位創建的Android
  3. 傳Android的位圖對象爲本地代碼
  4. 組像素緩衝區回到Android的側

這不適合我,因爲:

  1. 像素陣列創建我自己的代碼
  2. 如果我在android側創建它與指定的寬度和高度這使得android分配第二個緩衝區,它不好,因爲我將有24位圖秒(流視頻) 。

我需要不服這樣的:

  1. 通緩衝液從本機代碼和Bitmap.createFromBuffer(緩衝液緩衝液,INT寬度,高度INT,INT格式)
  2. 創建在本機代碼的Android位圖對象,設置像素緩衝區並返回到android

任何建議/想法?

+0

如何將它保存到SD卡作爲.jpg並再次讀取它? –

+0

這可能是解決方案,但我不確定移動設備是否適合爲流視頻保存幀 – 4ntoine

+0

通常,流式視頻涉及YUV緩衝區。 YUV到RGBA的轉換非常昂貴(與軟件h264解碼器使用的CPU資源順序相同,遠遠超過運行硬件解碼器所花費的時間)。使用renderscript或OpenGL可以改善YUV到RGB的轉換。 –

回答

1

如果你想創建一個從本地代碼的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); 
相關問題