当我试图将Mat图像转换为位图时,图像不会显示在我的设备中,相反,当我使用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()
转换为位图之前,我已经尝试过将图像转换为不同的颜色空间,但该应用程序已停止工作。如何修复我的代码,以便开始图像处理?提前谢谢。
文档并不过于清晰,但ARGB_8888
实际上意味着:每个通道8位,通道顺序为Alpha、Red、Green、Blue。
https://developer.android.com/reference/android/graphics/Bitmap.Config.html
当您使用RGB_565
时(正如上面的链接更清楚地解释的那样),您将按照"红、绿、蓝"的顺序获得通道,而不是alpha通道。
位图图像不支持Alpha通道——该通道定义不透明性(与透明度相反),其中值1.0(或二进制的所有1
s)是完全不透明的(完全不透明),值0.0是完全透明的(完全透明)。
您在转换中没有看到任何内容,因为您正试图将4通道图像写入位图的3通道支持中,本质上是将"Alpha,Red,Green"(ARG)映射到位图图像预期的"Red,Green,Blue"。
现在,从技术上讲,你可以做一些奇怪的事情,让ARG以RGB格式显示为图像,但这也假设A和RGB都在同一个域(0-to-255
或0.0-to-1.0
)。对于任何试图遵循你的代码的人来说,这基本上是不可读的。
当您使用正确的RGB_565
格式时,很可能您也会得到一个黑色图像,因为您做了new Mat(...)
,但没有为其分配任何内容。通过设计,Mat
类可能会用填充了0
的通道实例化其对象,而(R,G,B)
格式的(0,0,0)
是一个黑色像素,因此每个像素都是黑色的。
如果你想要位图,你的解决方案是切换到正确的RGB_565
——并且只在支持alpha掩码(也称为alpha通道)的图像上使用ARGB_8888
,比如PNG(Portable Network Graphics[images])——然后确保用你想要的颜色值内容填充像素。
如果您使用RGB_565
,您的代码是正确的,但它也正确,因为您还没有修改任何像素内容,所以会给您一个全黑图像。