我有BMP作为RGBA缓冲区(我可以将其保存为本地代码中的BMP,并将其视为.bmp图像),我需要将其从本地代码传递给android。我找到了类似的问题和答案,这是解决办法之一:
这不适合我,因为:
我需要这样的东西:
有什么建议/想法吗?
发布于 2015-07-10 08:25:07
如果要从本机代码创建java Bitmap对象,则应该执行以下操作:
在本机代码中,读取缓冲区,然后将每个像素都应用于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);https://stackoverflow.com/questions/24075508
复制相似问题