Проблема с получением цвета пикселя на палитре цветов - PullRequest
1 голос
/ 29 сентября 2010

В настоящее время я делаю палитру цветов (довольно стандартную, почти такую ​​же, как фотошоп, с меньшим количеством опций на данный момент: все еще на ранней стадии). Вот изображение реальной вещи: http://i.stack.imgur.com/oEvJW.jpg

Проблема заключается в следующем: чтобы получить цвет пикселя, который находится под селектором цвета (маленький, другой - мышь), у меня есть строка, которая, как я думал, сделает это:

_currentColor = Convert.hsbToHex(new HSB(0,
  ((_colorSelector.x + _colorSelector.width/2)*100)/_largeur,
  ((_colorSelector.y + _colorSelector.height/2)*100)/_hauteur
));

Просто для пояснения кода, я просто использую координаты селектора, чтобы создать новый цвет HSB (насыщенность представлена ​​на оси X и яркость (значение) на оси Y такого палитры цветов). Затем я преобразовываю этот цвет HSB в шестнадцатеричный и назначаю его свойству. В настоящий момент оттенок всегда равен 0, но это не имеет значения, так как я проверяю только красный цвет.

Это частично делает то, что я хотел, но возвращенные значения цвета инвертированы для большинства углов: для (0,0) он должен возвращать 0xFFFFFF, но вместо этого он возвращает 0x000000 для (256, 0) он должен возвращать 0xFF0000, но вместо этого он возвращает 0x000000 для (0, 256) он должен возвращать 0x000000, но вместо этого он возвращает 0xFFFFFF для (256, 256) он должен возвращать 0x000000, но вместо этого он возвращает 0xFF0000

Я пробовал много вариантов в моем коде, но я просто не могу исправить это правильно. Любые ответы / предложения приветствуются!

Ответы [ 3 ]

0 голосов
/ 29 сентября 2010

Просто поменяйте местами оси X и Y, и это решено.

0 голосов
/ 29 сентября 2010

Предполагается, что точка регистрации центрирована, что, похоже, имеет место, поскольку вы делаете:

(_colorSelector.x + _colorSelector.width/2)

Я думаю, что ваша формула должна выглядеть примерно так:

(_colorSelector.x + _colorSelector.width/2) / _colorSelector.width

Если ваша точка регистрации на (0,0), она должна быть просто:

(_colorSelector.x / _colorSelector.width);

Выше должно быть число в диапазоне 0...1

Кроме того, вы должны инвертировать это значение для яркости (потому что низкое значение y представляет высокую яркость, а высокое значение y - низкую яркость; поэтому яркость уменьшается вдоль оси y, а насыщенность увеличивается вдоль оси x). Так что для вашей оси у вы должны сделать:

1 - ((_colorSelector.y + _colorSelector.height/2) / _colorSelector.height)

(Опять же, при условии, что точка регистрации центрирована).

Если ваша функция преобразования рассчитывает проценты, то вы должны умножить на 100

(_colorSelector.x + _colorSelector.width/2) / _colorSelector.width * 100
(1 - ((_colorSelector.y + _colorSelector.height/2) / _colorSelector.height)) * 100

Может быть, я что-то упустил, хотя. Я не уверен, откуда взялись _largeur и _hauteur, но похоже, что это ширина и высота. Я думаю, что вы должны использовать высоту и ширину _colorSelector, но я могу ошибаться.

PS : Я надеюсь, что вы поняли идею, потому что я не скомпилировал приведенный выше код и, возможно, я испортил некоторые скобки или сделал какую-то другую глупую ошибку.

0 голосов
/ 29 сентября 2010

Я думаю, что ошибка (или одно из них) заключается в использовании значений в диапазоне 0..256, что может привести к переполнению, вместо этого попробуйте использовать 0..255.

...