Звучит как домашнее задание, но вот общая идея, или, по крайней мере, как бы я это сделал.
Для каждого пикселя вычислите среднюю яркость, поэтому сложите вместе R
G
и B
, а затем разделите на 3, чтобы получить результат (здесь вам понадобится переменная больше 8 бит!)
Теперь у вас есть значение обратно в диапазоне 0-255, указывающее яркость пикселя (есть различные способы для вычисления яркости, но пока это подойдет).
Полный синий - (0,0,255)
, полный желтый - (255,255,0)
- поэтому вам необходимо выполнить интерполяцию между этими значениями (здесь мы будем использовать линейную интерполяцию):
Если ваша яркость равна 50, например, это ~ 20% от 255, поэтому вы хотите, чтобы цвет был 80% синим и 20% желтым. Вы можете вычислить значение для красного канала следующим образом:
R = (brightness / max) * (R in Yellow - R in Blue);
С аналогичными расчетами для других каналов, поэтому для нашего пикселя с яркостью 50 мы бы сделали:
R = (50 / 255) * 255;
G = (50 / 255) * 255;
Конечно, у нас не может быть отрицательных значений, и использование идеи B in Yellow - B in Blue
не приведет к сокращению его для синего канала, вам нужно инвертировать интерполяцию. Взяв нашу 0,2 и вычитая ее из 1, мы можем работать в диапазоне 0-255 в другом направлении:
B = (1 - (50 / 255)) * 255;
Дополнительное примечание: для работы с чем-то подобным в C ++ я бы предложил использовать SDL, это очень удобно и просто.