首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对PixelFormat感到困惑

对PixelFormat感到困惑
EN

Stack Overflow用户
提问于 2012-08-14 09:46:55
回答 2查看 12.5K关注 0票数 14

我对安卓上的PixelFormat感到困惑。

我的设备是摩托罗拉。

我有两个问题:

  • 在Android2.3上,getWindowManager().getDefaultDisplay().getPixelFormat()返回4,代表五百六十五。据我所知,我的设备有16M颜色,这意味着每个像素有3个字节(或4个带有alpha通道)字节:

2^(8\*3) = 2^24 = 16M

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

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

那么,为什么getPixelFormat()不返回每像素3个字节(或4个类似于RGBA)的格式?是显示司机出了问题还是怎么了?我可以将PixelFormat设置为八八八八 (或模拟)吗?

  • 在Android4.1(自定义rom)上,getPixelFormat()返回5。但是这个价值是没有记录的。它代表什么?实际上,在这种情况下,效果与常数4相同。但在这一讨论中,我发现5代表RGBA_8888 (但没有证据支持这一说法)。那么,我如何才能计算出设备屏幕的真正格式呢?我还在Android2.2上找到了一个中国设备,它也有PixelFormat 5,但真正的格式是4 (作为我的摩托罗拉)。

我在谷歌上搜索过这些问题,什么也没发现。我唯一发现的就是那个nexus 7也有5种格式

更新:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-22 08:00:50

我只想在这次讨论中再加两分钱,不过我得事先承认,我找不到你们所有问题的决定性答案。

那么,为什么getPixelFormat()不返回每像素3个字节(或4个类似于RGBA)的格式?是显示司机出了问题还是怎么了?我可以将PixelFormat设置为八八八八 (或模拟)吗?

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

顺便提一句:我以前在Android中遇到过不对齐的常量定义,尽管我目前还记不起确切的位置.

为了确认,可能值得在运行时打印像素格式细节。如果确实定义了一个使用Java PixelFormat值但不匹配的本机常量,则可能会以这种方式显示“真实”格式。使用getPixelFormatInfo(int format, PixelFormat info)方法,它简单地委托从本机实现检索实际值。

在Android4.1(自定义rom)上,getPixelFormat()返回5,但是这个值没有文档化。它代表什么?

如前所述,有时在本机代码中定义的常量与Java中的常量不匹配,或者根本没有定义。这可能是这样的情况。您需要做一些调查来找出它所代表的含义,但这是相当简单的:

代码语言:javascript
复制
/**
 * 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)
};

(第121至148行)

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

顺便说一句,您可能希望尝试通过传入getPixelFormatInfo(...)作为标识符来使用前面提到的5方法来确定这个整数值的像素格式细节。看看还能得到什么会很有趣。我希望它能显示出与BGRA_8888定义相匹配的值,因此类似于摩托罗拉董事会的链接讨论中给出的值。

票数 8
EN

Stack Overflow用户

发布于 2012-08-18 11:20:56

如下文附件所示,RGBA_8888相当于1。

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

代码语言:javascript
复制
// Following fields are initialized from native code
private int mPixelFormat;

这意味着,由于某种原因,由于操作系统的决定而不是硬件功能,您的设备被视为RGB_565。实际上,这让我感到好奇。

有趣的是,对银河Nexus和Nexus 7的描述并不是有太多共同之处。GN N7

代码语言:javascript
复制
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;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11949709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档