- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我对 PixelFormat 感到困惑在安卓系统上。
我的设备是摩托罗拉 Defy。
我有两个问题:
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 吗? (或模拟)?
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 setPixelFormat
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/
我有一个程序可以打开一个窗口并快速改变背景颜色并随机弹出矩形和椭圆形。我的代码有效,但我不知道为什么,因为我没有在我的代码中调用 repaint() 函数。当我使用我个人的 update() 函数包含
var allRapidSpells = $$('input[value^=RSW]'); 谁能告诉我这是做什么的? 最佳答案 我敢猜测您正在使用 MooTools ,一个 JavaScript 框架
我有一个抽象父类,它有多个子类。我希望 child 能够拥有一个对于该 child 的每个实例都相同的变量。我不想将构造函数传递给 child 来告诉它它的名字,因为当它可以被硬编码时,这看起来很愚蠢
我刚刚在 Git 存储库上做了一些糟糕的事情,我不知道如何解决这个问题。我什至不知道我是怎么把它弄成这样的……! 在存储库(托管在 git hub 上)上,有 3 个我感兴趣的分支:master、br
我是 GIT 的新手,在理解提交日志图时遇到问题。 我感觉每条平行线都是一个分支。虽然我的源代码只有 2 个分支。我在下面提供的提交日志图中看到 3-4 条平行线(Microsoft Team Ser
我是 WPF 的新手,ScrollViewer 让我很沮丧。要么我只是没有“得到”它,要么它是一种有限的控制。 这是我的挫折: 水平滚动错误 水平滚动条仅在列表底部可见(我必须滚动到底部才能看到) 坏
那么 $('table.selectable td.capable input:text') 比 $('table.selectable td input:text') 更好吗?换句话说,指定一个类会
我刚刚完成了计算机图形学类(class),我们必须对光线追踪器进行编程。尽管所有结果都是正确的,但我对 OpenMP 的使用感到困惑(顺便说一句,这不是类(class)的一部分)。我有这个循环(C++
与 PatternSynonyms ( explicitly bidirectional form ),pattern-to-expr 方程实际上形成了一个函数,但拼写为大写(假设您最终得到正确类型的
我是 javascript/coffeescript 新手。 有人可以解释一下为什么这个 CoffeeScript/JavaScript 会毫无延迟地快速通过吗?我对第一种情况的想法是,它是对 upd
如果我调用document.getElementsByClassName('cl'),我会得到一个 HTMLCollection。它似乎包含 Element 对象而不是 HTMLElement 对象,
这是我本月的 azure payasyougo 使用费用。 我很难理解为什么我要为标准中型应用服务付费,我认为它会包含在计算时间中?我只运行一个云服务,这对于一个没有做太多事情的云服务来说似乎有点陡峭
除了the issue I am already having之外,我还在I saw a video on it之后安装了HBase(尚未安装)之前,还安装了Zookeeper。在安装它时,我遇到了许
我正在将 XSLT 与 regexp:match exslt 函数一起使用。上述函数采用 JavaScript Regex 模式。因此,我尝试匹配一组数字 1 到 3 OR 5 到 7 OR 9 到
我想知道为什么这段代码会给出消息:SyntaxError:意外的标记其他。 var compare = function(choice1,choice2){ if(choice1===choice2)
我尝试使用复选框和 JQuery 过滤日历上的事件, $(document).ready(function () { $('.scrollable-menu :checkbox').click(f
假设我们有一个用户想要一个名为:“test/lasdhjal.txt”,无论如何。现在,如果我将其放入新的文件(输入)中;对象里面,它会认为 test/是一个文件夹,而它是名称的一部分。我能做什么呢?
问题是 stash 的更改不会留在我 stash 它们的分支中。其他分支存储将被覆盖示例: 我愿意: git checkout iss4 // made some changes gi
我是一个 java 新手,并且在 StackOverflow 错误/在类之间访问文件的能力方面遇到了一个非常令人困惑的问题。我知道根本原因可能是我进行了一些递归调用,但修复它的语法却让我无法理解。我认
public X createData(int n) { int[] values = new int[n]; Random rand = new Random(); for
我是一名优秀的程序员,十分优秀!