为什么RGBA位图需要3x3阵列来存储1个像素?如何避免这种情况?

时间:2018-02-28 23:29:46

标签: java android opencv bitmap opencv4android

我有1x1 jpg图像,由一种红色组成。

我以这种方式从可绘制图像(Android)创建一个位图:

Bitmap bitmap_image = BitmapFactory.decodeResource(getResources(), R.drawable.onebyonered);

但是,在位图输出3,3上调用getWidth()getHeight()

然后我将位图转换为OpenCV矩阵:

Mat matrix = new Mat(1, 1, CvType.CV_64FC1);
// System.out.println(matrix);
Utils.bitmapToMat(bitmap_image, matrix);
// System.out.println(matrix);
System.out.println(matrix.dump());

第一个print语句返回Mat [ 1*1*CV_64FC1, ...,第二个print语句返回Mat [ 3*3*CV_8UC4, ...,矩阵转储(转换为字符串)显示:

[255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255;
255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255;
255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255]

使用以下方法对其进行Grayscaling:

Imgproc.cvtColor(matrix, matrix, Imgproc.COLOR_RGBA2GRAY);

生成3x3x1而不是预期的1x1x1:

[ 76,  76,  76;
  76,  76,  76;
  76,  76,  76]

考虑到上面提到的高度和宽度并假设转储应该是RGBA格式 - 为什么需要9个不同的值来表示1像素的单色图像?如何将此3x3x1更改为我想要的1x1x1 [76]?理想情况下,我使用的任何转换技术都应该是可逆的,或者我能够显示位图图像。

1 个答案:

答案 0 :(得分:1)

调用getWidth()getHeight()返回3x3,因为系统按照设备密度缩放图像,因此它返回了错误的大小。将图像放入assets并从中加载或放入drawable-nodpi文件夹。