android jni返回bitmap,Android jni cpp文件中的Mat to Bitmap

我正在用android进行原生开发.我不能在java中使用OpenCV.我将Bitmap作为jni的输入.我发现了一种转换Bitmap的方法 – >垫.然后我可以处理()Mat图像类型.现在我需要重新转换已处理的Mat-> Bitmap并将其发送到java文件.

我无法找到关于如何在jni c中完成Mat->位图转换的任何帖子.

如果我能就此得到任何建议,那将是非常有帮助的

解决方法:

我有同样的问题,这个代码是解决方案:

jobject mat_to_bitmap(JNIEnv * env, Mat & src, bool needPremultiplyAlpha, jobject bitmap_config){

jclass java_bitmap_class = (jclass)env->FindClass("android/graphics/Bitmap");

jmethodID mid = env->GetStaticMethodID(java_bitmap_class,

"createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");

jobject bitmap = env->CallStaticObjectMethod(java_bitmap_class,

mid, src.size().width, src.size().height, bitmap_config);

AndroidBitmapInfo info;

void* pixels = 0;

try {

//validate

CV_Assert(AndroidBitmap_getInfo(env, bitmap, &info) >= 0);

CV_Assert(src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4);

CV_Assert(AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0);

CV_Assert(pixels);

//type mat

if(info.format == ANDROID_BITMAP_FORMAT_RGBA_8888){

Mat tmp(info.height, info.width, CV_8UC4, pixels);

if(src.type() == CV_8UC1){

cvtColor(src, tmp, CV_GRAY2RGBA);

} else if(src.type() == CV_8UC3){

cvtColor(src, tmp, CV_RGB2RGBA);

} else if(src.type() == CV_8UC4){

if(needPremultiplyAlpha){

cvtColor(src, tmp, COLOR_RGBA2mRGBA);

}else{

src.copyTo(tmp);

}

}

} else{

Mat tmp(info.height, info.width, CV_8UC2, pixels);

if(src.type() == CV_8UC1){

cvtColor(src, tmp, CV_GRAY2BGR565);

} else if(src.type() == CV_8UC3){

cvtColor(src, tmp, CV_RGB2BGR565);

} else if(src.type() == CV_8UC4){

cvtColor(src, tmp, CV_RGBA2BGR565);

}

}

AndroidBitmap_unlockPixels(env, bitmap);

return bitmap;

} catch(cv::Exception e){

AndroidBitmap_unlockPixels(env, bitmap);

jclass je = env->FindClass("org/opencv/core/CvException");

if(!je) je = env->FindClass("java/lang/Exception");

env->ThrowNew(je, e.what());

return bitmap;

} catch (...){

AndroidBitmap_unlockPixels(env, bitmap);

jclass je = env->FindClass("java/lang/Exception");

env->ThrowNew(je, "Unknown exception in JNI code {nMatToBitmap}");

return bitmap;

}

}

你可以这样打电话:

JNIEXPORT jobject JNICALL Java_com_duongtd_project_MyNDK_myfunction

(JNIEnv *env, jclass ob, jobject bitmap){

Mat src =

....

//get source bitmap's config

jclass java_bitmap_class = (jclass)env->FindClass("android/graphics/Bitmap");

jmethodID mid = env->GetMethodID(java_bitmap_class, "getConfig", "()Landroid/graphics/Bitmap$Config;");

jobject bitmap_config = env->CallObjectMethod(bitmap, mid);

jobject _bitmap = mat_to_bitmap(env, src, false, bitmap_config);

AndroidBitmap_unlockPixels(env, bitmap);

//and finally you can get bitmap for android

return _bitmap;

}

别忘了申报:

#include

我知道你有一个将android Bitmap转换为C Mat的解决方案,但是我在这里发布了以上代码的任何问题:

JNIEXPORT jobject JNICALL Java_com_duongtd_project_MyNDK_myfunction

(JNIEnv *env, jclass ob, jobject bitmap){

int ret;

AndroidBitmapInfo info;

void* pixels = 0;

if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) {

__android_log_print(ANDROID_LOG_VERBOSE, APPNAME,"AndroidBitmap_getInfo() failed ! error=%d", ret);

return NULL;

}

if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888 ) {

__android_log_print(ANDROID_LOG_VERBOSE, APPNAME,"Bitmap format is not RGBA_8888!");

return NULL;

}

if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) {

__android_log_print(ANDROID_LOG_VERBOSE, APPNAME,"AndroidBitmap_lockPixels() failed ! error=%d", ret);

}

// init our output image

Mat mbgra(info.height, info.width, CV_8UC4, pixels);

...

}

标签:c-2,android,opencv,bitmap,mat

来源: https://codeday.me/bug/20190519/1134161.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值