如何将从 C++ 发送的 cv::MAT 字节数组转换为 Java 中的位图?

Posted

技术标签:

【中文标题】如何将从 C++ 发送的 cv::MAT 字节数组转换为 Java 中的位图?【英文标题】:How to convert cv::MAT byte array sent from C++ to a Bitmap in Java? 【发布时间】:2016-08-26 13:36:12 【问题描述】:

我正在通过 JNI 从 C++ 接收字节数组以及单个通道 cv::Mat 图像的宽度和高度。在 Java 中,我需要从中创建一个 Bitmap 以进行进一步处理。我已经尝试了标准选项,但我无法解码Bitmap(我不断收到null)。 JNI中的代码是

jbyteArray myJByteArray = env->NewByteArray(imageToScan.cols * imageToScan.rows);
env->SetByteArrayRegion(myJByteArray, 0, imageToScan.cols * imageToScan.rows, (jbyte *) imageToScan.data);

我正在检查我在 Java 中收到的数组长度以及宽度和高度,它们都正常。现在,我尝试了以下方法:

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.outHeight = height;
    options.outWidth = width;
    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);

但它不起作用。我知道我不能使用BitmapFactory.decodeByteArray,因为它只适用于压缩位图,但不知道如何更正。

【问题讨论】:

【参考方案1】:

使用Bitmap.createBitmap(int[] colors, int offset, int stride, int width, int height, Bitmap.Config config)显然第一个参数是未压缩的数组。

【讨论】:

我应该为 stride 和 config 设置什么值?

以上是关于如何将从 C++ 发送的 cv::MAT 字节数组转换为 Java 中的位图?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 cv::mat 对象从 python 模块传递给 c++ 函数并返回返回的 cv::mat 类型的对象?

如何从 c++ 接口 cv::Mat 转换为 c IplImage?

如何发送包含 cv::Mat 的 Qt 信号?

OpenCV 使用 stride 从数组生成 cv::Mat

来自表示 RGB 图像的浮点数组的初始 CV::MAT

Android JNI:将cv :: Mat转换为jbyteArray