Android 对像素格式感到困惑吗

Android 对像素格式感到困惑吗,android,pixelformat,Android,Pixelformat,我对安卓系统感到困惑 我的设备是摩托罗拉Defy 我有两个问题: 在Android 2.3上,getWindowManager().getDefaultDisplay().getPixelFormat()返回所代表的内容。据我所知,我的设备有16M颜色,这意味着每像素有3(或4个alpha通道)字节: 但是RGB_565格式每像素有2个字节(16位),代表65K颜色: 那么,为什么getPixelFormat()不返回每像素3字节(或者像RGBA一样4字节)的格式呢?是显示驱动程序问题还是什

我对安卓系统感到困惑

我的设备是摩托罗拉Defy

我有两个问题:

  • 在Android 2.3上,getWindowManager().getDefaultDisplay().getPixelFormat()返回所代表的内容。据我所知,我的设备有16M颜色,这意味着每像素有3(或4个alpha通道)字节:
但是
RGB_565
格式每像素有2个字节(16位),代表65K颜色:

那么,为什么
getPixelFormat()
不返回每像素3字节(或者像RGBA一样4字节)的格式呢?是显示驱动程序问题还是什么?我可以将
PixelFormat
设置为(或模拟)吗

  • 在Android 4.1(自定义rom)上,
    getPixelFormat()
    返回5。但是这个值没有记录。它代表什么?实际上,在这种情况下,效果与常量
    4
    相同。但从中我发现5代表
    RGBA_8888
    (但没有证据证明这一说法)。那么,我怎样才能知道设备屏幕的真实格式呢?我还在安卓2.2上发现了一款中文设备,它也有
    PixelFormat
    5,但真正的格式是4(就像我的摩托罗拉一样)
我在谷歌上搜索了这些问题,什么也没找到。我唯一发现的就是这个

更新:

我找到了这个方法,但它实际上并没有改变主像素格式。

根据motodev论坛上的线程,返回值5对应于RGBA_8888。该线程声明PixelFormat的文档不完整且已过时,并且已存档。但是,指向该bug的链接现在返回404

此外,我似乎在(4.1)中找不到任何支持该主张的东西,因为在那里RGBA_8888被赋值为1

我猜这个值是摩托罗拉和其他一些设备特有的,因为我在Nexus7和GalaxyNexus上看到了相同的输出


编辑:我给谷歌的一名员工发了邮件,他告诉我有5封与BGRA_8888通信,正如MH的回复和我之前链接的摩托罗拉论坛帖子所示。他建议我为文档问题提交一个bug。请在错误报告中加星号,以便尽早采取行动。

RGBA_8888对应于1,如下面的附件所示

如果转到与mPixelFormat相关的代码,您会发现以下内容

// Following fields are initialized from native code
private int mPixelFormat;
这意味着,由于某种原因,您的设备被视为RGB_565,这是由于操作系统的决定,而不是硬件功能。 事实上,这让我感到好奇

有趣的是,对银河系Nexus和Nexus7的描述并没有太多共同之处


我只想在这次讨论中加上我的两分钱,尽管我应该事先承认,我无法找到你所有问题的结论性答案

那么,为什么
getPixelFormat()
不返回带有3的格式(或类似RGBA的4格式) 每像素字节数?是显示驱动程序问题还是什么?我可以设定吗
PixelFormat
to(或模拟)

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

另一方面:我以前在安卓系统中确实遇到过未对齐的常量定义,尽管我现在还不记得具体在哪里

只是确认一下,在运行时打印像素格式的细节可能是值得的。如果确实定义了一个使用Java
PixelFormat
值但不匹配的本机常量,则可以通过这种方式显示“真实”格式。使用方法,该方法只需委托从本机实现检索实际值

在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)
};

如果您将这些值与
PixelFormat.java
中定义的值进行比较,您会发现它们加起来非常好(正如它们应该做的那样)。它还显示了神秘的
5
,即BGRA_8888的含义;RGBA_8888的变体


顺便说一下,您可能希望通过将
5
作为标识符传入,尝试使用前面提到的
getPixelFormatInfo(…)
方法确定此整数值的像素格式详细信息。看看会有什么回报会很有趣。我希望它显示的值与BGRA_8888的定义相匹配,因此与摩托罗拉董事会上的相关讨论中给出的值相似。

5代表RGBA_8888的说法是不正确的(甚至没有来自该人的证明链接)。Actally format 4(RGB_565)在ICS或Jelly Bean上运行良好(与Android 2.3相同)。如果是RGBA_8888,我可能会在颜色方面遇到麻烦。正如我在第二点中所说的,我也找不到他的说法的证据。然而,线程上的另一个人运行了一些测试,表明它是RGBX_8888或RGBA_8888。感谢您的回答(+1),但这对我没有任何帮助:(您想知道什么?知道吗
// Following fields are initialized from native code
private int mPixelFormat;
public static final int RGBA_8888   = 1;
public static final int RGBX_8888   = 2;
public static final int RGB_888     = 3;
public static final int RGB_565     = 4;

@Deprecated
public static final int RGBA_5551   = 6;
@Deprecated
public static final int RGBA_4444   = 7;
public static final int A_8         = 8;
public static final int L_8         = 9;
@Deprecated
public static final int LA_88       = 0xA;
@Deprecated
public static final int RGB_332     = 0xB;
/**
 * 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)
};