首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在本机代码中从RGBA缓冲区创建Android位图?

如何在本机代码中从RGBA缓冲区创建Android位图?
EN

Stack Overflow用户
提问于 2014-06-06 06:23:28
回答 1查看 1.5K关注 0票数 1

我有BMP作为RGBA缓冲区(我可以将其保存为本地代码中的BMP,并将其视为.bmp图像),我需要将其从本地代码传递给android。我找到了类似的问题和答案,这是解决办法之一:

  1. 在android中创建android位图对象
  2. 将其传递给本机代码
  3. 在本机代码中设置像素缓冲区
  4. 将位图返回到android端

这不适合我,因为:

  1. 像素数组创建为i本机代码。
  2. 如果我以指定的宽度和高度在android端创建它,这将使android分配第二个缓冲区,这不是很好,因为我将每秒得到24个位图(流视频)。

我需要这样的东西:

  1. 从本机代码和Bitmap.createFromBuffer(缓冲区、int宽度、int高度、int格式)通过缓冲区
  2. 在本机代码中创建android位图对象,设置像素缓冲区并返回到android。

有什么建议/想法吗?

EN

回答 1

Stack Overflow用户

发布于 2015-07-10 08:25:07

如果要从本机代码创建java Bitmap对象,则应该执行以下操作:

在本机代码中,读取缓冲区,然后将每个像素都应用于argb格式,如果您有rgba,您可以这样做:

代码语言:javascript
复制
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位图:

代码语言:javascript
复制
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);

不要忘记释放对象以避免内存泄漏。

代码语言:javascript
复制
env->DeleteLocalRef(array);
env->DeleteLocalRef(bitmapClass);
env->DeleteLocalRef(bitmapConfig);
env->DeleteLocalRef(argb8888Obj);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24075508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档