Получить значение цвета в градиенте на основе значения - PullRequest
0 голосов
/ 10 апреля 2019

Предположим, у меня есть следующий градиент:

  • Старт (0): зеленый (0, 255, 0)
  • Центр (0,5): оранжевый (255, 165, 0)
  • Конец (1): красный (255, 0, 0)

Есть ли сейчас расчет или существующая функция для считывания значения цвета из этого градиента на основе значения, которое меняется каждую секунду?

Как мысль моя: можно, например, в Photoshop создайте изображение, скажем, шириной 100px и высотой 1px. Теперь я накладываю градиент цвета со значениями и точками, упомянутыми выше, по всей поверхности. Значение, по которому я хочу получить цвет, также находится только между значениями int от 0 до 100. Поэтому я могу загрузить это изображение в переменную или около того (не отображая его в пользовательском интерфейсе) и получить цвет на основе моего значения с функцией «GetPixel», так что если, например, значение 50, я бы получил оранжевый, потому что 50-й пиксель на изображении соответствует оранжевому. Это было бы правдоподобно и (теоретически) легко программировать.

Но теперь значение меняется каждую секунду. И я думаю, что где-то читал, что функция GetPixel относительно медленная. Конечно, я мог бы просто запрограммировать это сейчас (что я, вероятно, сделаю позже для тестирования), но мне кажется, что это очень ресурсоемкий процесс. Есть ли лучшая альтернатива?

1 Ответ

1 голос
/ 10 апреля 2019

Вот простая линейная интерполяция между цветами в пространстве RGB с использованием System.Drawing.Color для хранения цветов:

public int LinearInterp(int start, int end, double percentage) => start + (int)Math.Round(percentage * (end - start));
public Color ColorInterp(Color start, Color end, double percentage) =>
    Color.FromArgb(LinearInterp(start.A, end.A, percentage),
                   LinearInterp(start.R, end.R, percentage),
                   LinearInterp(start.G, end.G, percentage),
                   LinearInterp(start.B, end.B, percentage));
public Color GradientPick(double percentage, Color Start, Color Center, Color End) {
    if (percentage < 0.5)
        return ColorInterp(Start, Center, percentage / 0.5);
    else if (percentage == 0.5)
        return Center;
    else
        return ColorInterp(Center, End, (percentage - 0.5)/0.5);
}

И вы бы использовали это так:

var Start = Color.FromArgb(255, 0, 255, 0);
var Center = Color.FromArgb(255, 255, 165, 0);
var End = Color.FromArgb(255, 255, 0, 0);

var Pick = GradientPick(0.75, Start, Center, End);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...