我将在这次讨论中加两分钱,尽管我应该提前承认,我无法为您的所有问题找到确凿的答案。
那么,为什么getPixelFormat()
不返回每像素 3 个(或 4 个如 RGBA)字节的格式呢?是显卡驱动问题还是什么?我可以设置
PixelFormat
为RGBA_8888(或模拟)吗?
我对你在这里确切地问什么感到有点困惑。的返回值getPixelFormat()
只是一个整数,它提供了一种识别活动像素格式的方法;它并不意味着表示任何压缩成数字的数据(例如,与MeasureSpec
)。不幸的是,我没有解释为什么返回的结果与您预期的不同。我最好的猜测可能是由于操作系统的决定,因为从硬件的角度来看似乎没有限制,或者本机实现中定义的常量与 Java 中的常量不匹配。如果摩托罗拉搞砸了定义,那么您返回像素格式的事实4
并不一定意味着它真的是 RGB_565。
附带说明:实际上我之前在 Android 中遇到过未对齐的常量定义,尽管我目前不记得确切的位置......
只是为了确认一下,可能值得在运行时打印出像素格式的详细信息。如果确实定义了一个使用 JavaPixelFormat
值但不匹配的本机常量,那么您可能会以这种方式显示“真实”格式。使用该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)
};
资料来源:(hardware.h
第 121-148 行)
如果您将这些值与 中定义的值进行比较PixelFormat.java
,您会发现它们相加得非常好(应该如此)。也说明了神秘的含义5
,即BGRA_8888;RGBA_8888 的变体。
顺便说一句,您可能想尝试使用上述getPixelFormatInfo(...)
方法通过5
作为标识符传入来确定此整数值的像素格式详细信息。看看会返回什么会很有趣。我希望它显示与 BGRA_8888 定义匹配的值,因此类似于摩托罗拉板上链接讨论中给出的值。