Выбор цвета на Android - ошибки округления glReadPixels - PullRequest
4 голосов
/ 28 сентября 2010

Я использую выбор цвета в открытых окнах на Android и вычисляю цветовой ключ, чтобы сравнить его со значениями, которые я получаю из 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));
}

Сначала значение с плавающей запятой преобразуется в intvalue, а затем преобразуется в байт.Значения с плавающей точкой описывают цветовые каналы красный, зеленый, синий (от 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 ]

2 голосов
/ 15 октября 2011

например если вы установите красный float (31/255), я думаю, что преобразование будет таким.

31 (0001_1111) преобразуется в 3 (0000_0011), если формат цвета RGB565 (по умолчанию)

тогда мы используем glReadPixels (), чтобы получить значение

3 (0000_0011) преобразуется в 24 (0001_1000)

Одним словом, если вы установите 31 для красного цвета, вы получите 24 в конце.

Ключом к устранению ошибки округления является метод преобразования из RGB565 в RGB88, который вы не делали.

Вы можете попробовать. Удачи.

1 голос
/ 12 января 2011

Java-байты подписаны.

-28 = 0xe4 в байте со знаком = 228 десятичных, если вы рассматриваете 0xe4 как беззнаковое.
228/255 = 0,894 в поплавке

...