代码之家  ›  专栏  ›  技术社区  ›  Lobstw

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

  •  0
  • Lobstw  · 技术社区  · 8 年前

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

    我通过以下方式从可绘制图像(Android)创建位图:

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

    但是,呼叫 getWidth() getHeight() 在位图上输出3、3。

    然后,我将位图转换为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());
    

    第一条打印语句返回 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?理想情况下,我使用的任何转换技术都应该是可逆的,或者我能够显示位图图像。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Arpan Sarkar    8 年前

    使命感 getWidth() getHeight() 返回3x3,因为系统根据设备密度缩放图像,所以返回的大小错误。将图像放入 assets 然后从那里装载或放进去 drawable-nodpi 文件夹

    推荐文章