【Android jni】BitmapオブジェクトとMatオブジェクトの相互変換

1.JNIはビットマップからマットへの変換を実装します


void bitmap2mat(JNIEnv *env, jobject bitmap,Mat &mat){
    //锁定画布
    void *pixels;
    AndroidBitmap_lockPixels(env,bitmap,&pixels);
    //获取Bitmap的信息
    AndroidBitmapInfo bitmapInfo;
    AndroidBitmap_getInfo(env,bitmap,&bitmapInfo);
    //判断图像通道数
    if(bitmapInfo.format==AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGBA_8888){//mat的四通道
        LOGD("图像4通道");
        Mat image(bitmapInfo.height,bitmapInfo.width,CV_8UC4,pixels);
        image.copyTo(mat);//深拷贝
    }else if(bitmapInfo.format==AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGB_565){//mat的二通道CV_8UC2
        LOGD("图像2通道");
        Mat image(bitmapInfo.height,bitmapInfo.width,CV_8UC2,pixels);
        image.copyTo(mat);
    }else{
       
    }
    //解锁画布
    AndroidBitmap_unlockPixels(env,bitmap);
}

呼び出し例:

extern "C"
JNIEXPORT void JNICALL
Java_com_example_myapplication_MainActivity_opencv_1test(JNIEnv *env, jclass clazz,
                                                         jobject bitmap) {
    Mat mat;
    bitmap2mat(env, bitmap, mat);
    imwrite("/sdcard/DCIM/bitmap2img.png",mat);
}

2.JNI は Mat から Bitmap への変換を実装します

void mat2bitmap(JNIEnv *env, jobject bitmap,Mat &mat){
    //锁定画布
    void *pixels;
    AndroidBitmap_lockPixels(env,bitmap,&pixels);
    //获取Bitmap的信息
    AndroidBitmapInfo bitmapInfo;
    AndroidBitmap_getInfo(env,bitmap,&bitmapInfo);
    int ret;
    // 将Mat数据复制到Bitmap
    cv::Mat bitmapMat(bitmapInfo.height, bitmapInfo.width, CV_8UC4, pixels);
    mat.copyTo(bitmapMat);//深拷贝
    AndroidBitmap_unlockPixels(env, bitmap);//解锁画布
}

 呼び出し例:

extern "C"
JNIEXPORT void JNICALL
Java_com_example_myapplication_MainActivity_opencv_1test(JNIEnv *env, jclass clazz,
                                                         jobject bitmap) {
  
    //获取Bitmap的信息
    AndroidBitmapInfo bitmapInfo;
    AndroidBitmap_getInfo(env,bitmap,&bitmapInfo);
    //创建和Bitmap尺寸相同的Mat对象
    Mat mat1(bitmapInfo.height ,bitmapInfo.width,CV_8UC4,Scalar(0,0,255,255));
    //把mat对象的像素数据复制到bitmap中
    mat2bitmap(env,bitmap,mat1);

}

完全なコード:

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <jni.h>
#include <android/bitmap.h>
#include <opencv2/opencv.hpp>
#include <android/log.h>
#define LOG_TAG "xxx"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

using namespace cv;
using namespace std;
void bitmap2mat(JNIEnv *env, jobject bitmap,Mat &mat);
void mat2bitmap(JNIEnv *env, jobject bitmap,Mat &mat);

void bitmap2mat(JNIEnv *env, jobject bitmap,Mat &mat){
    //锁定画布
    void *pixels;
    AndroidBitmap_lockPixels(env,bitmap,&pixels);
    //获取Bitmap的信息
    AndroidBitmapInfo bitmapInfo;
    AndroidBitmap_getInfo(env,bitmap,&bitmapInfo);
    //判断图像通道数
    if(bitmapInfo.format==AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGBA_8888){//mat的四通道
        LOGD("图像4通道");
        Mat image(bitmapInfo.height,bitmapInfo.width,CV_8UC4,pixels);
        image.copyTo(mat);//深拷贝
    }else if(bitmapInfo.format==AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGB_565){//mat的二通道CV_8UC2
        LOGD("图像2通道");
        Mat image(bitmapInfo.height,bitmapInfo.width,CV_8UC2,pixels);
        image.copyTo(mat);
    }else{
        LOGD("图像3通道");
        Mat image(bitmapInfo.height,bitmapInfo.width,CV_8UC3,pixels);
        image.copyTo(mat);
    }
    //解锁画布
    AndroidBitmap_unlockPixels(env,bitmap);
}
void mat2bitmap(JNIEnv *env, jobject bitmap,Mat &mat){
    //锁定画布
    void *pixels;
    AndroidBitmap_lockPixels(env,bitmap,&pixels);
    //获取Bitmap的信息
    AndroidBitmapInfo bitmapInfo;
    AndroidBitmap_getInfo(env,bitmap,&bitmapInfo);
    int ret;
    // 将Mat数据复制到Bitmap
    cv::Mat bitmapMat(bitmapInfo.height, bitmapInfo.width, CV_8UC4, pixels);
    mat.copyTo(bitmapMat);
    AndroidBitmap_unlockPixels(env, bitmap);

}

Android 上で JNI を介して Bitmap を呼び出し、CMake を介してダイナミック リンク ライブラリをコンパイルする場合は、jnigraphics イメージ ライブラリを追加する必要があります。

target_link_libraries(  #次の依存関係         jnigraphics を
        target_link_libraries に追加します         )


 

おすすめ

転載: blog.csdn.net/weixin_63357306/article/details/132851451