C++ 代码实现Mat和Bitmap的相互转换
时间: 2024-06-10 18:03:53 浏览: 18
C语言实现Mat和Bitmap的相互转换,可以通过以下代码实现:
```c
#include <opencv2/opencv.hpp>
#include <android/bitmap.h>
using namespace cv;
bool matToBitmap(JNIEnv *env, Mat &src, jobject bitmap) {
AndroidBitmapInfo bitmapInfo;
void *pixels;
int ret;
// 获取bitmap信息
if ((ret = AndroidBitmap_getInfo(env, bitmap, &bitmapInfo)) < 0) {
return false;
}
// 锁定bitmap并获取pixels指针
if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) {
return false;
}
// 将Mat转换为Bitmap并复制到pixels中
if (bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGBA_8888) {
Mat tmp;
cvtColor(src, tmp, COLOR_BGR2RGBA);
memcpy(pixels, tmp.data, tmp.elemSize() * tmp.total());
} else {
Mat tmp;
cvtColor(src, tmp, COLOR_BGR2RGB);
memcpy(pixels, tmp.data, tmp.elemSize() * tmp.total());
}
// 解锁bitmap
AndroidBitmap_unlockPixels(env, bitmap);
return true;
}
bool bitmapToMat(JNIEnv *env, jobject bitmap, Mat &dst) {
AndroidBitmapInfo info;
void *pixels;
int ret;
// 获取bitmap信息
if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) {
return false;
}
// 锁定bitmap并获取pixels指针
if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) {
return false;
}
// 保存Bitmap中的像素数据到Mat中
if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888) {
Mat tmp(info.height, info.width, CV_8UC4, pixels);
cvtColor(tmp, dst, COLOR_RGBA2BGR);
} else {
Mat tmp(info.height, info.width, CV_8UC2, pixels);
cvtColor(tmp, dst, COLOR_RGB2BGR);
}
// 解锁bitmap
AndroidBitmap_unlockPixels(env, bitmap);
return true;
}
```
这里使用了OpenCV库中的cvtColor函数来实现Mat与Bitmap之间的颜色格式转换,将Mat中的数据以RGB或RGBA格式保存到Bitmap中。在转换过程中,需要注意的是两种数据结构的行列排列方式不同,需要在复制时做出调整,否则会出现结果不正确的情况。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)