Path: blob/master/modules/java/generator/src/cpp/utils.cpp
16354 views
// This file is part of OpenCV project.1// It is subject to the license terms in the LICENSE file found in the top-level directory2// of this distribution and at http://opencv.org/license.html34#include "opencv2/core.hpp"5#include "opencv2/imgproc.hpp"67#ifdef __ANDROID__8#include <android/bitmap.h>910#define LOG_TAG "org.opencv.android.Utils"11#include "common.h"1213using namespace cv;1415extern "C" {1617/*18* Class: org_opencv_android_Utils19* Method: void nBitmapToMat2(Bitmap b, long m_addr, boolean unPremultiplyAlpha)20*/2122JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nBitmapToMat223(JNIEnv * env, jclass, jobject bitmap, jlong m_addr, jboolean needUnPremultiplyAlpha);2425JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nBitmapToMat226(JNIEnv * env, jclass, jobject bitmap, jlong m_addr, jboolean needUnPremultiplyAlpha)27{28AndroidBitmapInfo info;29void* pixels = 0;30Mat& dst = *((Mat*)m_addr);3132try {33LOGD("nBitmapToMat");34CV_Assert( AndroidBitmap_getInfo(env, bitmap, &info) >= 0 );35CV_Assert( info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||36info.format == ANDROID_BITMAP_FORMAT_RGB_565 );37CV_Assert( AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0 );38CV_Assert( pixels );39dst.create(info.height, info.width, CV_8UC4);40if( info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 )41{42LOGD("nBitmapToMat: RGBA_8888 -> CV_8UC4");43Mat tmp(info.height, info.width, CV_8UC4, pixels);44if(needUnPremultiplyAlpha) cvtColor(tmp, dst, COLOR_mRGBA2RGBA);45else tmp.copyTo(dst);46} else {47// info.format == ANDROID_BITMAP_FORMAT_RGB_56548LOGD("nBitmapToMat: RGB_565 -> CV_8UC4");49Mat tmp(info.height, info.width, CV_8UC2, pixels);50cvtColor(tmp, dst, COLOR_BGR5652RGBA);51}52AndroidBitmap_unlockPixels(env, bitmap);53return;54} catch(const cv::Exception& e) {55AndroidBitmap_unlockPixels(env, bitmap);56LOGE("nBitmapToMat caught cv::Exception: %s", e.what());57jclass je = env->FindClass("org/opencv/core/CvException");58if(!je) je = env->FindClass("java/lang/Exception");59env->ThrowNew(je, e.what());60return;61} catch (...) {62AndroidBitmap_unlockPixels(env, bitmap);63LOGE("nBitmapToMat caught unknown exception (...)");64jclass je = env->FindClass("java/lang/Exception");65env->ThrowNew(je, "Unknown exception in JNI code {nBitmapToMat}");66return;67}68}6970// old signature is left for binary compatibility with 2.4.0 & 2.4.1, to removed in 2.571JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nBitmapToMat72(JNIEnv * env, jclass, jobject bitmap, jlong m_addr);7374JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nBitmapToMat75(JNIEnv * env, jclass, jobject bitmap, jlong m_addr)76{77Java_org_opencv_android_Utils_nBitmapToMat2(env, 0, bitmap, m_addr, false);78}7980/*81* Class: org_opencv_android_Utils82* Method: void nMatToBitmap2(long m_addr, Bitmap b, boolean premultiplyAlpha)83*/8485JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nMatToBitmap286(JNIEnv * env, jclass, jlong m_addr, jobject bitmap, jboolean needPremultiplyAlpha);8788JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nMatToBitmap289(JNIEnv * env, jclass, jlong m_addr, jobject bitmap, jboolean needPremultiplyAlpha)90{91AndroidBitmapInfo info;92void* pixels = 0;93Mat& src = *((Mat*)m_addr);9495try {96LOGD("nMatToBitmap");97CV_Assert( AndroidBitmap_getInfo(env, bitmap, &info) >= 0 );98CV_Assert( info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||99info.format == ANDROID_BITMAP_FORMAT_RGB_565 );100CV_Assert( src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols );101CV_Assert( src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4 );102CV_Assert( AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0 );103CV_Assert( pixels );104if( info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 )105{106Mat tmp(info.height, info.width, CV_8UC4, pixels);107if(src.type() == CV_8UC1)108{109LOGD("nMatToBitmap: CV_8UC1 -> RGBA_8888");110cvtColor(src, tmp, COLOR_GRAY2RGBA);111} else if(src.type() == CV_8UC3){112LOGD("nMatToBitmap: CV_8UC3 -> RGBA_8888");113cvtColor(src, tmp, COLOR_RGB2RGBA);114} else if(src.type() == CV_8UC4){115LOGD("nMatToBitmap: CV_8UC4 -> RGBA_8888");116if(needPremultiplyAlpha) cvtColor(src, tmp, COLOR_RGBA2mRGBA);117else src.copyTo(tmp);118}119} else {120// info.format == ANDROID_BITMAP_FORMAT_RGB_565121Mat tmp(info.height, info.width, CV_8UC2, pixels);122if(src.type() == CV_8UC1)123{124LOGD("nMatToBitmap: CV_8UC1 -> RGB_565");125cvtColor(src, tmp, COLOR_GRAY2BGR565);126} else if(src.type() == CV_8UC3){127LOGD("nMatToBitmap: CV_8UC3 -> RGB_565");128cvtColor(src, tmp, COLOR_RGB2BGR565);129} else if(src.type() == CV_8UC4){130LOGD("nMatToBitmap: CV_8UC4 -> RGB_565");131cvtColor(src, tmp, COLOR_RGBA2BGR565);132}133}134AndroidBitmap_unlockPixels(env, bitmap);135return;136} catch(const cv::Exception& e) {137AndroidBitmap_unlockPixels(env, bitmap);138LOGE("nMatToBitmap caught cv::Exception: %s", e.what());139jclass je = env->FindClass("org/opencv/core/CvException");140if(!je) je = env->FindClass("java/lang/Exception");141env->ThrowNew(je, e.what());142return;143} catch (...) {144AndroidBitmap_unlockPixels(env, bitmap);145LOGE("nMatToBitmap caught unknown exception (...)");146jclass je = env->FindClass("java/lang/Exception");147env->ThrowNew(je, "Unknown exception in JNI code {nMatToBitmap}");148return;149}150}151152// old signature is left for binary compatibility with 2.4.0 & 2.4.1, to removed in 2.5153JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nMatToBitmap154(JNIEnv * env, jclass, jlong m_addr, jobject bitmap);155156JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nMatToBitmap157(JNIEnv * env, jclass, jlong m_addr, jobject bitmap)158{159Java_org_opencv_android_Utils_nMatToBitmap2(env, 0, m_addr, bitmap, false);160}161162} // extern "C"163164#endif //__ANDROID__165166167