我的问题有点奇怪。我已经阅读了很多文章,并且我确信我的代码应该返回范围为0到1的3(或4个基于设置)浮点值。我应该将它们转换为RGB。 BUT
gl.glReadPixels(screenWidth - this.x, this.y, 1, 1, GL10.GL_RGB, GL10.GL_UNSIGNED_BYTE, pixelBuffer);
byte [] bb = new byte [3];
此代码返回类似
的值{ -9, -7, -7 }
我不知道如何从中获取RGB颜色。我尝试过多次,分割等等。我的代码与99%的代码示例完全相同,但我仍然收到了非常奇怪的值。
整个目标是在屏幕上选择触摸点的颜色
// UPDATE
ByteBuffer pixelBuffer = ByteBuffer.allocateDirect(3);
pixelBuffer.order(ByteOrder.nativeOrder());
gl.glReadPixels(screenWidth - this.x, this.y, 1, 1, GL10.GL_RGB, GL10.GL_UNSIGNED_BYTE, pixelBuffer);
byte[] bb = new byte[3];
pixelBuffer.get(bb);
String key = bb[0] + " " + bb[1] + " " + bb[2];
Log.d("KOLOR", key);
String colorName = "";
float r = (float)pixelBuffer.get(0);
float g = (float)pixelBuffer.get(1);
float b = (float)pixelBuffer.get(2);
takeScreenshot = false;
例如,当我选择"变量r,g,b的红色值,其中:-1.0,36.0,0.0
答案 0 :(得分:1)
正如您在代码中看到的那样,您尝试检索UNSIGNED BYTE
:
GL10.GL_UNSIGNED_BYTE
并将其分配给:一个字节(-array)。从你的结果我可以看出,这个字节不是无符号的。
将像245这样的值分配给有符号字节会发生什么?它的二进制值被解释为带符号的数字,最高位是符号,因此如果我没有弄错的话,无符号字节上下文中的{-9, -7, -7}
应为{245,247,247}
。
在Java中,所有原始整数类型都是有符号的,没有办法解决这个问题。
所以你可能想要做的是创建一个包含(正确的)整数值的第二个数组:
int[] ib = new int[3];
for(int i=0; i<3; i++)
ib[i] = (int)((int)bb[i] & 0xff);
然后输出结果。
String key = ib[0] + " " + ib[1] + " " + ib[2];
此外,您应该更改代码的这一部分:
float r = (float)pixelBuffer.get(0);
float g = (float)pixelBuffer.get(1);
float b = (float)pixelBuffer.get(2);
到
float r = ib[0]/255.0f;
float g = ib[1]/255.0f;
float b = ib[2]/255.0f;
因为,一旦开始将颜色值用作float
s,您希望它们在0和1之间对齐