2014-06-06 60 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); 
相关问题