Как создать изображение экрана из TColors и интенсивностей (в Delphi) - PullRequest
6 голосов
/ 14 сентября 2010

У меня есть (спектрографический профиль) набор данных длины волны (ось X) и интенсивности (ось Y, в произвольных единицах, которые могут иметь разные диапазоны ...)

Я хочу преобразовать это числоданные в графическом представлении, как показано в нижней части изображения ниже.

Но в Delphi (2010) я никогда ничего не делал с Canvas, TImages, растровыми изображениями или любым другим способом, которым я хотел бы получить этоэкран.

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

МожетКто-нибудь указывает мне правильное направление или предоставляет пример кода, который пересекает значения x, y, создавая цветное изображение?Я надеюсь, что мое решение позволит мне (или пользователю) регулировать уровни (контрастность, яркость).

Заранее спасибо.

alt text

Related SOposts: Алгоритм для преобразования любого положительного целого числа в значение RGB

Преобразование частоты света в RGB?

Ответы [ 2 ]

2 голосов
/ 14 сентября 2010

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

Отображение цветов на самом деле очень просто.Вы можете использовать стандартный компонент TImage на форме.Как только вы определите, какое значение TColor идет в определенной позиции, вы можете установить его с помощью

image.Canvas.Pixels[x, y] := aColor;

EDIT : Как отобразить длину волны на оттенок:

Это немного сложно, так как левая сторона вашего спектра кажется фиолетовой, а красный - справа.В HSL красный находится в позиции 0.Вам нужно будет инвертировать ось X, чтобы красный был равен 0, а фиолетовый - высок.Вы можете получить это, просто сказав value := MAX_VALUE - value;

Затем вам нужно откалибровать линию.Установите длину волны, соответствующую полному красному цвету, равному 0, а дальний синий конец - тому, что соответствует его соответствующему оттенку.(Если вы можете преобразовать длину волны в TColor, а затем из TColor в HSL, который не составит труда вычислить.) Это ваш диапазон, и вам нужно нормализовать все длины волн, чтобы он соответствовал этому диапазону.

ПростоГлядя на это, мне кажется, что левый конец вашего примера спектра имеет цветовой оттенок около 270 градусов, что соответствует 192 по шкале от 0 до 255.Поэтому возьмите свой спектр с красного на синий - опять же, помните, что красный - это НИЗКИЙ, а не ВЫСОКИЙ - и нормализуйте его до диапазона 0-1-192 (или независимо от фактического высокого значения), и вы получите значение H.

Кроме того, если у вас есть несколько цветов на правом конце вашей цветовой линии, которые немного выходят за пределы полного красного в сторону фиолетового, то у вас будет отрицательный оттенок, который возвращается к 255.

1 голос
/ 14 сентября 2010

У вас есть именно то, что вам нужно в этой библиотеке Delphi от efg.
Но вы действительно должны сначала прочитать статью о спектре видимого света: Spectra .
"Целью этой программы является отображение цветов RGB как функции длины волны для видимого света (от 380 до 780 нм)."

Единственная модификация, которую вы должны добавить, - это модулировать интенсивность,Но, как предположил Мейсон, прохождение представления HSI упрощает настройку интенсивности: поэтому быстрое и грязное решение состоит в том, что, как только вы получите RGB по длине волны, для преобразования в HSI настройте I, а затем верните обратно в RGB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...