1
#define LOG_TAG "org.opencv.android.Utils"
4
#include "opencv2/core.hpp"
5
#include "opencv2/imgproc.hpp"
8
#include <android/bitmap.h>
15
* Class: org_opencv_android_Utils
16
* Method: void nBitmapToMat2(Bitmap b, long m_addr, boolean unPremultiplyAlpha)
19
JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nBitmapToMat2
20
(JNIEnv * env, jclass, jobject bitmap, jlong m_addr, jboolean needUnPremultiplyAlpha);
22
JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nBitmapToMat2
23
(JNIEnv * env, jclass, jobject bitmap, jlong m_addr, jboolean needUnPremultiplyAlpha)
25
AndroidBitmapInfo info;
27
Mat& dst = *((Mat*)m_addr);
31
CV_Assert( AndroidBitmap_getInfo(env, bitmap, &info) >= 0 );
32
CV_Assert( info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||
33
info.format == ANDROID_BITMAP_FORMAT_RGB_565 );
34
CV_Assert( AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0 );
36
dst.create(info.height, info.width, CV_8UC4);
37
if( info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 )
39
LOGD("nBitmapToMat: RGBA_8888 -> CV_8UC4");
40
Mat tmp(info.height, info.width, CV_8UC4, pixels);
41
if(needUnPremultiplyAlpha) cvtColor(tmp, dst, COLOR_mRGBA2RGBA);
44
// info.format == ANDROID_BITMAP_FORMAT_RGB_565
45
LOGD("nBitmapToMat: RGB_565 -> CV_8UC4");
46
Mat tmp(info.height, info.width, CV_8UC2, pixels);
47
cvtColor(tmp, dst, COLOR_BGR5652RGBA);
49
AndroidBitmap_unlockPixels(env, bitmap);
51
} catch(const cv::Exception& e) {
52
AndroidBitmap_unlockPixels(env, bitmap);
53
LOGE("nBitmapToMat catched cv::Exception: %s", e.what());
54
jclass je = env->FindClass("org/opencv/core/CvException");
55
if(!je) je = env->FindClass("java/lang/Exception");
56
env->ThrowNew(je, e.what());
59
AndroidBitmap_unlockPixels(env, bitmap);
60
LOGE("nBitmapToMat catched unknown exception (...)");
61
jclass je = env->FindClass("java/lang/Exception");
62
env->ThrowNew(je, "Unknown exception in JNI code {nBitmapToMat}");
67
// old signature is left for binary compatibility with 2.4.0 & 2.4.1, to removed in 2.5
68
JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nBitmapToMat
69
(JNIEnv * env, jclass, jobject bitmap, jlong m_addr);
71
JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nBitmapToMat
72
(JNIEnv * env, jclass, jobject bitmap, jlong m_addr)
74
Java_org_opencv_android_Utils_nBitmapToMat2(env, 0, bitmap, m_addr, false);
78
* Class: org_opencv_android_Utils
79
* Method: void nMatToBitmap2(long m_addr, Bitmap b, boolean premultiplyAlpha)
82
JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nMatToBitmap2
83
(JNIEnv * env, jclass, jlong m_addr, jobject bitmap, jboolean needPremultiplyAlpha);
85
JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nMatToBitmap2
86
(JNIEnv * env, jclass, jlong m_addr, jobject bitmap, jboolean needPremultiplyAlpha)
88
AndroidBitmapInfo info;
90
Mat& src = *((Mat*)m_addr);
94
CV_Assert( AndroidBitmap_getInfo(env, bitmap, &info) >= 0 );
95
CV_Assert( info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||
96
info.format == ANDROID_BITMAP_FORMAT_RGB_565 );
97
CV_Assert( src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols );
98
CV_Assert( src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4 );
99
CV_Assert( AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0 );
101
if( info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 )
103
Mat tmp(info.height, info.width, CV_8UC4, pixels);
104
if(src.type() == CV_8UC1)
106
LOGD("nMatToBitmap: CV_8UC1 -> RGBA_8888");
107
cvtColor(src, tmp, COLOR_GRAY2RGBA);
108
} else if(src.type() == CV_8UC3){
109
LOGD("nMatToBitmap: CV_8UC3 -> RGBA_8888");
110
cvtColor(src, tmp, COLOR_RGB2RGBA);
111
} else if(src.type() == CV_8UC4){
112
LOGD("nMatToBitmap: CV_8UC4 -> RGBA_8888");
113
if(needPremultiplyAlpha) cvtColor(src, tmp, COLOR_RGBA2mRGBA);
114
else src.copyTo(tmp);
117
// info.format == ANDROID_BITMAP_FORMAT_RGB_565
118
Mat tmp(info.height, info.width, CV_8UC2, pixels);
119
if(src.type() == CV_8UC1)
121
LOGD("nMatToBitmap: CV_8UC1 -> RGB_565");
122
cvtColor(src, tmp, COLOR_GRAY2BGR565);
123
} else if(src.type() == CV_8UC3){
124
LOGD("nMatToBitmap: CV_8UC3 -> RGB_565");
125
cvtColor(src, tmp, COLOR_RGB2BGR565);
126
} else if(src.type() == CV_8UC4){
127
LOGD("nMatToBitmap: CV_8UC4 -> RGB_565");
128
cvtColor(src, tmp, COLOR_RGBA2BGR565);
131
AndroidBitmap_unlockPixels(env, bitmap);
133
} catch(const cv::Exception& e) {
134
AndroidBitmap_unlockPixels(env, bitmap);
135
LOGE("nMatToBitmap catched cv::Exception: %s", e.what());
136
jclass je = env->FindClass("org/opencv/core/CvException");
137
if(!je) je = env->FindClass("java/lang/Exception");
138
env->ThrowNew(je, e.what());
141
AndroidBitmap_unlockPixels(env, bitmap);
142
LOGE("nMatToBitmap catched unknown exception (...)");
143
jclass je = env->FindClass("java/lang/Exception");
144
env->ThrowNew(je, "Unknown exception in JNI code {nMatToBitmap}");
149
// old signature is left for binary compatibility with 2.4.0 & 2.4.1, to removed in 2.5
150
JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nMatToBitmap
151
(JNIEnv * env, jclass, jlong m_addr, jobject bitmap);
153
JNIEXPORT void JNICALL Java_org_opencv_android_Utils_nMatToBitmap
154
(JNIEnv * env, jclass, jlong m_addr, jobject bitmap)
156
Java_org_opencv_android_Utils_nMatToBitmap2(env, 0, m_addr, bitmap, false);