bitmapToMat必须是ARGB_8888
时间: 2023-12-30 10:03:39 浏览: 76
这个说法不完全正确。虽然在使用bitmapToMat函数将Bitmap转换为Mat时,需要使用ARGB_8888格式的Bitmap,但是Mat本身并不要求使用这种格式。Mat可以使用多种颜色空间和像素格式,例如GRAY、RGB、RGBA等等。因此,如果要从其他类型的图像数据创建Mat,可以根据实际情况选择合适的像素格式。
相关问题
安卓开发 Bitmap.Config.ARGB_4444的位图传给c++ 该如何接收这张位图并显示
要将安卓开发中的 Bitmap.Config.ARGB_4444 格式的位图传递给C++,您需要将该位图转换为C++中的图像格式,并使用OpenCV库在C++中显示该图像。下面是一个简单的示例代码,用于将ARGB_4444图像转换为OpenCV中的Mat格式:
```
// 将Android Bitmap转换为OpenCV Mat
cv::Mat bitmapToMat(JNIEnv* env, jobject bitmap) {
AndroidBitmapInfo info;
void* pixels = 0;
cv::Mat dst;
try {
CV_Assert(AndroidBitmap_getInfo(env, bitmap, &info) >= 0);
CV_Assert(info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||
info.format == ANDROID_BITMAP_FORMAT_RGB_565 ||
info.format == ANDROID_BITMAP_FORMAT_RGBA_4444);
CV_Assert(AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0);
CV_Assert(pixels);
dst.create(info.height, info.width, CV_8UC4);
if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888) {
cv::Mat tmp(info.height, info.width, CV_8UC4, pixels);
tmp.copyTo(dst);
} else if (info.format == ANDROID_BITMAP_FORMAT_RGB_565) {
cv::Mat tmp(info.height, info.width, CV_8UC2, pixels);
cvtColor(tmp, dst, cv::COLOR_BGR5652RGBA);
} else if (info.format == ANDROID_BITMAP_FORMAT_RGBA_4444) {
cv::Mat tmp(info.height, info.width, CV_8UC2, pixels);
cvtColor(tmp, dst, cv::COLOR_BGRA4444_RGBA);
}
} catch (const 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 dst;
}
AndroidBitmap_unlockPixels(env, bitmap);
return dst;
}
// 在C++中显示OpenCV Mat
void showMat(cv::Mat& mat) {
cv::imshow("Image", mat);
cv::waitKey(0);
}
```
在您的C++代码中,您可以将ARGB_4444位图转换为OpenCV Mat,然后使用 showMat 函数在窗口中显示它:
```
jobject bitmap = ... // 获取ARGB_4444格式的Bitmap对象
cv::Mat mat = bitmapToMat(env, bitmap);
showMat(mat);
```
请注意,您需要在C++中包含以下头文件才能使用这些函数:
```
#include <jni.h>
#include <android/bitmap.h>
#include <opencv2/opencv.hpp>
```
java如何使用opencv将模糊的图片变清晰并增加图片鲜亮度,写一个成员方法实现传入和返回值都是bitmap
要使用 OpenCV 处理图片,需要先在 Java 项目中导入 OpenCV 库。你可以在 OpenCV 的官网下载适合自己电脑系统的库文件,然后在项目中添加依赖。接着,你可以使用如下代码实现图片的模糊处理和鲜亮度增强:
```java
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.android.Utils;
import org.opencv.imgproc.Imgproc;
public Bitmap processImage(Bitmap bitmap) {
// 将 bitmap 转为 OpenCV 的 Mat 类型
Mat mat = new Mat();
Utils.bitmapToMat(bitmap, mat);
// 使用高斯滤波进行模糊处理
Imgproc.GaussianBlur(mat, mat, new Size(0, 0), 10);
// 增加鲜亮度
Core.addWeighted(mat, 1.5, mat, 0, 0, mat);
// 将处理后的 Mat 类型转为 bitmap
Bitmap processedBitmap = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mat, processedBitmap);
return processedBitmap;
}
```
这个成员方法接收一个 Bitmap 对象,返回一个处理后的 Bitmap 对象。其中,`Utils.bitmapToMat()` 方法可以将 Bitmap 转为 Mat 对象,`Imgproc.GaussianBlur()` 方法实现高斯滤波,`Core.addWeighted()` 方法实现鲜亮度增强,`Utils.matToBitmap()` 方法将处理后的 Mat 对象转为 Bitmap 对象。你需要根据自己的需求调整滤波半径和权重系数。
阅读全文