Вопрос по-прежнему недостаточно четко определен, поскольку серый цвет не работает как любой другой цвет (ни в модели RGB, ни в модели HSV), поэтому не существует единого очевидного способа реализации кнопок других цветов. .
Однако, один естественный способ (может быть, самый естественный) состоит в том, чтобы сделать, как я предложил в моем ответе на предыдущий вопрос, а именно преобразовать каждый пиксель из HSV(h, s, v)
в HSV(0, s, v)
в красном регистре, HSV(120, s, v)
в зеленом корпусе и HSV(240, s, v)
в синем корпусе. Числа 0, 120 и 240 являются углами оттенка.
Чтобы сделать это, вам нужны только функции для преобразования между RGB и HSV (и я дал вам их в последнем вопросе).
Я вижу в вашем коде, что вы назвали функции BlueToRed(Color)
и т. Д., Что неуместно, поскольку любой цвет станет красным и т. Д., Поэтому более подходящими именами будут ColorToRed
и т. Д.
Чтобы сделать это как можно более понятным, я добавил код для красной и зеленой кнопок в вашей программе. Смотрите обновленную версию на
http://privat.rejbrand.se/ColorSwap.zip
(Также обратите внимание, что «ColorSwap» является неподходящим именем. Лучшее имя будет «FixHue».)
Производительность
Кроме того, как вы могли заметить, производительность ужасна ! Цветное изображение занимает несколько секунд!
Это не потому, что процессор медленный (действительно, он чрезвычайно быстрый), а из-за двух ошибок в дизайне:
Никогда не обновляйте растровое изображение на экране. Вместо этого обновите растровое изображение в памяти, а затем, когда закончите, скопируйте растровое изображение на экран.
Не используйте свойство Pixels
. Это неловко медленно. Вместо этого используйте Scanline
.
Если вы все сделаете правильно, вы сможете делать несколько сотен обновлений в секунду ...