将图像转换为位图后,图像为黑色或根本不显示

时间:2016-07-20 10:53:50

标签: android opencv bitmap mat bitmapfactory

当我尝试将Mat图像转换为Bitmap时,图像不会显示在我的设备中,相反,当我使用Bitmap.Config.RGB_565时,显示的图像为黑色。这是我的代码:

 Mat src = new Mat(bmp.getHeight(), bmp.getWidth(), CvType.CV_8UC1);
 imgToProcess = Utils.bitmapToMat(bmp, src);
 Bitmap bmpOut = Bitmap.createBitmap(imgToProcess.cols(),imgToProcess.rows(), Bitmap.Config.ARGB_8888);
 Utils.matToBitmap(imgToProcess, bmpOut);
 imv.setImageBitmap(bmpOut);
 rotateImage(bmpOut);

我正在使用以下所有库:

import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

在使用Imgproc.cvtColor()转换为位图之前,我已尝试将图像转换为不同的颜色空间,但应用程序已停止工作。 我如何修复我的代码,以便我可以从图像处理开始? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

文档不是过度清除,但似乎ARGB_8888实际上意味着:每个通道8位,通道顺序为Alpha,红色,绿色,蓝色。

https://developer.android.com/reference/android/graphics/Bitmap.Config.html

当您使用RGB_565时(如上面的链接更清楚地说明),您将按照“红色,绿色,蓝色”,没有Alpha通道的顺序获取频道。

位图图像不支持Alpha通道 - 定义不透明度的通道(与透明度相反),其中值1.0(或二进制中的所有1)完全不透明(完全不透明)和值0.0是完全透明的(完全透明)。

您在转换中没有看到任何内容,因为您正在尝试将4通道图像写入位图的3通道支持,实际上将“Alpha,Red,Green”(ARG)映射到“Red,Green,蓝色“的位图图像期望。

现在,从技术上讲,你可以做一些古怪的事情,让ARG显示为RGB格式的图像,但也假设A和RGB都在同一个域中(0-to-2550.0-to-1.0 )。对于任何想要遵循您的代码的人来说,这几乎是不可读的。

当您使用正确的RGB_565格式时,您很可能也会获得黑色图像,因为您执行了new Mat(...)并且没有为其分配任何内容,并且按照设计{{1} } class可能使用Mat填充的通道实例化其对象,而0格式的(0,0,0)是黑色像素,因此每个像素都是黑色。

如果你想要一个位图,你的解决方案就是切换到正确的(R,G,B) - 并且只对支持alpha-mask(也称为alpha通道)的图像使用RGB_565,如PNG(Portable Network)图形[图像]) - 然后还要确保用您想要的颜色值的内容填充像素。

如果你使用ARGB_8888,你的代码是正确的,但它也正确给你全黑图像,因为你尚未修改任何像素内容。