为什么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_位图函数