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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么RGBA位图需要3x3阵列来存储1个像素?如何避免这种情况?相关的知识,希望对你有一定的参考价值。

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

我以这种方式从drawable图像(android)创建一个位图:

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

但是,在位图输出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]

使用以下方法对其进行灰度化:

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

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

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

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

答案

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

以上是关于为什么RGBA位图需要3x3阵列来存储1个像素?如何避免这种情况?的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学输出图元_14_OpenGL像素阵列函数_1_位图函数

计算机图形学输出图元_14_OpenGL像素阵列函数_1_位图函数

计算3x3窗口的均值滤波和中值滤波(向下取整保留整数值)。

UWP 手绘视频创作工具技术分享系列 - 位图的绘制

OpenGL像素阵列函数

Matlab:提取存储在单元阵列中的所有图像的像素