Я пытаюсь создать обои, и я использую преобразование HSV в классе «android.graphics.color». Я был очень удивлен, когда понял, что преобразование созданного цвета HSV с заданным оттенком (0..360) в цвет rgb (целое число) и обратное преобразование в цвет HSV не приведет к тому же оттенку. Это мой код:Неверное преобразование HSV на Android
int c = Color.HSVToColor(new float[] { 100f, 1, 1 });
float[] f = new float[3];
Color.colorToHSV(c, f);
alert(f[0]);
Я начинаю с оттенка 100 градусов, и результат 99.76471. Интересно, почему существует (на мой взгляд) относительно большая неточность.
Но гораздо большая проблема заключается в том, что при повторном добавлении этого значения в код новый результат снова уменьшается.
int c = Color.HSVToColor(new float[] { 99.76471f, 1, 1 });
float[] f = new float[3];
Color.colorToHSV(c, f);
alert(f[0]);
Если начато с 99.76471, я получаю 99.52941. Для меня это проблема. Я сделал что-то подобное в java с классом «java.awt.Color», где у меня не было этих проблем. К сожалению, я не могу использовать этот класс в android.
I * believe * это случай другого преобразования, используемого между 16 и 32-битным целым числом, однако это может быть отключено. Я помню несколько лет назад, столкнувшись с проблемой со звуковыми файлами и преобразованием из массива байтов. В конце концов я только округлял фигуру до ближайшего целого int. – dave
Я поддерживаю идею дэйва. Одна вещь, которая может быть полезна, состоит в том, чтобы заметить, что разница между исходным значением 100 и округленным результатом 99.76471 равна 60/255, а 255 = 2^8-1 (довольно часто для хранения значений rgb на 8 бит) , То же самое верно для 99.76471 и 99.52941. У меня нет полной теории, но похоже, что основная арифметика пошла не так. – elias