gpt4 book ai didi

android - 对 PixelFormat 感到困惑

转载 作者:可可西里 更新时间:2023-11-01 19:05:45 26 4
gpt4 key购买 nike

我对 PixelFormat 感到困惑在安卓系统上。

我的设备是摩托罗拉 Defy。

我有两个问题:

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

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

                2^(8*2) = 2^16 = 65K

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

  • 在 Android 4.1(自定义 rom)上,getPixelFormat() 返回 5。但是这个值没有记录。它代表什么?实际上,在这种情况下效果与常量 4 相同。但是来自this discussion我发现 5 代表 RGBA_8888(但没有证据证明该说法)。那么我怎样才能弄清楚设备屏幕的真实格式呢?我还发现了一台 Android 2.2 的中国设备,它也有 PixelFormat 5,但真正的格式是 4(如我的摩托罗拉)。

我用谷歌搜索了这些问题,但一无所获。我唯一发现的是 nexus 7 also has 5 format .

更新:

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

最佳答案

我将在本次讨论中加入我的两分钱,但我应该事先承认,我无法为您的所有问题找到决定性的答案。

So, why getPixelFormat() doesn't return format with 3 (or 4 like RGBA) bytes per pixel? Is it display driver problems or something? Can I set PixelFormat to RGBA_8888 (or analogue)?

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

旁注:我之前在 Android 中确实遇到过未对齐的常量定义,尽管我目前记不起具体位置......

只是为了确认,可能值得在运行时打印出像素格式的详细信息。如果确实定义了使用 Java PixelFormat 值但不匹配的 native 常量,则您可能会以这种方式显示“真实”格式。使用 getPixelFormatInfo(int format, PixelFormat info)方法,它只是委托(delegate)从 native 实现中检索实际值。

On Android 4.1 (custom rom), getPixelFormat() returns 5. But this value is undocumented. What does it stand for?

如前所述,有时 native 代码中定义的常量与 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)
};

Source: hardware.h (lines 121-148)

如果您将这些值与 PixelFormat.java 中定义的值进行比较,您会发现它们相加得很好(它们应该如此)。也说明了神秘的5的含义,即BGRA_8888; RGBA_8888 的变体。

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

关于android - 对 PixelFormat 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11949709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com