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



当我试图将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-2550.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,您的代码是正确的,但它也正确,因为您还没有修改任何像素内容,所以会给您一个全黑图像。

相关内容

  • 没有找到相关文章

最新更新