对PixelFormat感到困惑

Art*_*huk 14 android pixelformat

我对Android上的PixelFormat感到困惑.

我的设备是摩托罗拉Defy.

我有两个问题:

  • 在Android 2.3上getWindowManager().getDefaultDisplay().getPixelFormat()返回4代表RGB_565.据我所知,我的设备有16M颜色,这意味着每个像素3个(或4个alpha通道)字节:
                2^(8*3) = 2^24 = 16M
Run Code Online (Sandbox Code Playgroud)

RGB_565格式每像素有2个字节(16位),代表65K颜色:

                2^(8*2) = 2^16 = 65K
Run Code Online (Sandbox Code Playgroud)

那么,为什么getPixelFormat()不返回每像素3(或4个像RGBA)字节的格式?它是否显示驱动程序问题?我可以设置PixelFormatRGBA_8888(或模拟)吗?

  • 在Android 4.1(自定义ROM)上,getPixelFormat()返回5.但是这个价值没有记载.它代表什么?实际上,在这种情况下效果与常数相同4.但是从这次讨论中我发现5代表RGBA_8888(但没有证据证明该陈述).那么如何才能找出设备屏幕的真实格式?另外我在Android 2.2上发现了一个中文设备,也有PixelFormat 5个,但真正的格式是4(就像我的摩托罗拉).

我搜索了这些问题但没有发现任何问题.我发现唯一的东西是nexus 7也有5种格式.

更新:

我找到了方法,getWindow().setFormat()但它实际上并没有改变主像素格式.

MH.*_*MH. 8

我只想在这次讨论中加上我的两分钱,但我应该事先承认我找不到你所有问题的确凿答案.

那么,为什么getPixelFormat()不返回每像素3(或4个像RGBA)字节的格式?它是否显示驱动程序问题?我可以设置 PixelFormatRGBA_8888(或模拟)吗?

我有点疑惑你在这里问的是什么.返回值getPixelFormat()只是一个整数,它提供了一种识别活动像素格式的方法; 它并不意味着代表压缩成数字的任何数据(例如与之一样MeasureSpec).不幸的是,我没有解释为什么返回的不同于你的预期.我最好的猜测是由于操作系统的决定,因为从硬件的角度看似乎没有限制,或者,本机实现中定义的常量与Java中的常量不匹配.4如果摩托罗拉搞砸了这些定义,那么你回归像素格式的事实并不一定意味着它真的是RGB_565.

旁注:我之前在Android中遇到过不对齐的常量定义,虽然我现在无法回想起究竟在哪里......

只是为了确认,在运行时打印像素格式细节可能是值得的.如果确实定义了使用Java PixelFormat值但不匹配的本机常量,则可以通过这种方式显示"真实"格式.使用该getPixelFormatInfo(int format, PixelFormat info)方法,该方法只是委派从本机实现中检索实际值.

在Android 4.1(自定义rom)上,getPixelFormat()返回5.但是此值未记录.它代表什么?

如前所述,有时在本机代码中定义的常量与Java中的常量不匹配,或者根本没有定义.这可能就是这种情况.你需要做一些挖掘来找出它代表什么,但它相当简单:

/**
 * pixel format definitions
 */

enum {
    HAL_PIXEL_FORMAT_RGBA_8888          = 1,
    HAL_PIXEL_FORMAT_RGBX_8888          = 2,
    HAL_PIXEL_FORMAT_RGB_888            = 3,
    HAL_PIXEL_FORMAT_RGB_565            = 4,
    HAL_PIXEL_FORMAT_BGRA_8888          = 5,
    HAL_PIXEL_FORMAT_RGBA_5551          = 6,
    HAL_PIXEL_FORMAT_RGBA_4444          = 7,
    /* 0x8 - 0xF range unavailable */
    HAL_PIXEL_FORMAT_YCbCr_422_SP       = 0x10,     // NV16
    HAL_PIXEL_FORMAT_YCrCb_420_SP       = 0x11,     // NV21 (_adreno)
    HAL_PIXEL_FORMAT_YCbCr_422_P        = 0x12,     // IYUV
    HAL_PIXEL_FORMAT_YCbCr_420_P        = 0x13,     // YUV9
    HAL_PIXEL_FORMAT_YCbCr_422_I        = 0x14,     // YUY2 (_adreno)
    /* 0x15 reserved */
    HAL_PIXEL_FORMAT_CbYCrY_422_I       = 0x16,     // UYVY (_adreno)
    /* 0x17 reserved */
    /* 0x18 - 0x1F range unavailable */
    HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED = 0x20,     // NV12_adreno_tiled
    HAL_PIXEL_FORMAT_YCbCr_420_SP       = 0x21,     // NV12
    HAL_PIXEL_FORMAT_YCrCb_420_SP_TILED = 0x22,     // NV21_adreno_tiled
    HAL_PIXEL_FORMAT_YCrCb_422_SP       = 0x23,     // NV61
    HAL_PIXEL_FORMAT_YCrCb_422_P        = 0x24,     // YV12 (_adreno)
};
Run Code Online (Sandbox Code Playgroud)

资料来源:( hardware.h第121-148行)

如果你要将这些值与定义的值进行比较PixelFormat.java,你会发现它们相当不错(正如他们应该的那样).它还显示了神秘的含义5,即BGRA_8888; RGBA_8888的变种.

顺便说一下,您可能想要尝试getPixelFormatInfo(...)通过传入5标识符来确定此整数值的像素格式详细信息.看到返回的内容会很有趣.我希望它显示符合BGRA_8888定义的值,因此类似于摩托罗拉板上链接讨论中给出的值.