当我尝试将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()
转换为位图之前,我已尝试将图像转换为不同的颜色空间,但应用程序已停止工作。
我如何修复我的代码,以便我可以从图像处理开始?
提前谢谢。
答案 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-255
或0.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
,你的代码是正确的,但它也正确给你全黑图像,因为你尚未修改任何像素内容。