Art*_*huk 14 android pixelformat
我对Android上的PixelFormat感到困惑.
我的设备是摩托罗拉Defy.
我有两个问题:
getWindowManager().getDefaultDisplay().getPixelFormat()返回4代表RGB_565.据我所知,我的设备有16M颜色,这意味着每个像素3个(或4个alpha通道)字节:Run Code Online (Sandbox Code Playgroud)2^(8*3) = 2^24 = 16M
但RGB_565格式每像素有2个字节(16位),代表65K颜色:
Run Code Online (Sandbox Code Playgroud)2^(8*2) = 2^16 = 65K
那么,为什么getPixelFormat()不返回每像素3(或4个像RGBA)字节的格式?它是否显示驱动程序问题?我可以设置PixelFormat为RGBA_8888(或模拟)吗?
getPixelFormat()返回5.但是这个价值没有记载.它代表什么?实际上,在这种情况下效果与常数相同4.但是从这次讨论中我发现5代表RGBA_8888(但没有证据证明该陈述).那么如何才能找出设备屏幕的真实格式?另外我在Android 2.2上发现了一个中文设备,也有PixelFormat 5个,但真正的格式是4(就像我的摩托罗拉).我搜索了这些问题但没有发现任何问题.我发现唯一的东西是nexus 7也有5种格式.
更新:
我找到了方法,getWindow().setFormat()但它实际上并没有改变主像素格式.
我只想在这次讨论中加上我的两分钱,但我应该事先承认我找不到你所有问题的确凿答案.
那么,为什么
getPixelFormat()不返回每像素3(或4个像RGBA)字节的格式?它是否显示驱动程序问题?我可以设置PixelFormat为RGBA_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)
如果你要将这些值与定义的值进行比较PixelFormat.java,你会发现它们相当不错(正如他们应该的那样).它还显示了神秘的含义5,即BGRA_8888; RGBA_8888的变种.
顺便说一下,您可能想要尝试getPixelFormatInfo(...)通过传入5标识符来确定此整数值的像素格式详细信息.看到返回的内容会很有趣.我希望它显示符合BGRA_8888定义的值,因此类似于摩托罗拉板上链接讨论中给出的值.
| 归档时间: |
|
| 查看次数: |
10524 次 |
| 最近记录: |