android上的颜色选择 - glReadPixels舍入错误

时间:2010-09-28 09:59:10

标签: android opengl-es color-picker picking

我在android上使用opengl es中的颜色选择,我正在计算一个颜色键,将它与我从glReadPixels获得的值进行比较:

ByteBuffer PixelBuffer = ByteBuffer.allocateDirect(4);
PixelBuffer.order(ByteOrder.nativeOrder());
gl.glReadPixels(x, y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, PixelBuffer);
byte b[] = new byte[4];
PixelBuffer.get(b);
String key = "" + b[0] + b[1] + b[2];

可以使用以下任意颜色手动计算此键:

public static byte floatToByteValue(float f) {
    return (byte) ((int) (f * 255f));
}

首先将float值转换为intvalue然后castet转换为byte。浮点值描述颜色系列红绿蓝(从0.0f到1.0f)。 示例:0.0f转换为255(现在为整数),然后从255转换为-1(字节

这很好但是opengl似乎有时会出现舍入错误。例如:

0.895 -> -28  and opengl returns -27
0.897 -> -28  and opengl returns -27
0.898 -> -28  and opengl returns -27
0.8985 -> -27 and opengl returns -27
0.899 -> -27  and opengl returns -26
0.9 -> -27    and opengl returns -26
0.91 -> -24   and opengl returns -24

也许我的计算方法不正确?有没有人知道如何避免这些偏差?

2 个答案:

答案 0 :(得分:2)

例如,

如果设置红色浮点数(31/255),我认为转换是这样的。

如果颜色格式为RGB565(默认值),

31(0001_1111)将转换为3(0000_0011)

然后我们使用glReadPixels()来获取值

3(0000_0011)转换为24(0001_1000)

总之,如果你设置31为红色,你最终会得到24。

消除舍入误差的关键是从RGB565转换为RGB88的方法,你没有这样做。

你可以尝试一下。祝你好运。

答案 1 :(得分:1)

Java字节已签名。

如果将0xe4视为无符号,则

-28 = 0xe4,有符号字节= 228十进制 228/255 = 0.894浮动