2010-09-14 15 views
5

Mam zestaw danych (profil spektrograficzny) długości fali (oś x) i intensywności (oś y, w dowolnych jednostkach, które mogą mieć różne zakresy) .)Jak utworzyć obraz ekranu z TColors i intensywności (w Delphi)

Chcę przekonwertować te dane numeryczne na widok graficzny, jak pokazano na dole obrazu poniżej.

Ale, nigdy nie zrobiłem nic w Delphi (2010) z Canvas, TImages, bitmapami lub w jakikolwiek inny sposób, który dostałbym to na ekran.

(Oczywiście, jeśli mogę przekonwertować moje dane do jednego rzędu pikseli obrazu, ja po prostu skopiować ten wiersz tyle razy, ile potrzeba dla mojego pożądanej wysokości obrazu.)

Czy ktoś może wskazać mi w dobrym kierunku lub podać przykładowy kod, który przechodzi przez wartości x, y, tworząc kolorowy obraz? Mam nadzieję, że moje rozwiązanie pozwoli mi (lub użytkownikowi) dostosować poziomy (kontrast, jasność).

Z góry dziękuję.

alt text

Podobne SO wypowiedzi: Algorithm to convert any positive integer to an RGB value

Convert light frequency to RGB?

Odpowiedz

2

Cóż, wygląda mi na to twoi długości fal są barwy, a intensywność jest inne słowo dla jasności. Uzyskanie właściwych kolorów byłoby naprawdę prostym zadaniem, gdyby tylko użytkownik miał a model that represents colors in terms of hue and brightness i sposób na konwersję między nim a RGB ... :-)

Wyświetlanie kolorów jest bardzo proste. Możesz użyć standardowego komponentu TImage w formularzu. Po pracy, co wartość TColor idzie w pewnej pozycji, można ustawić go

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

EDIT: Jak mapować długość fali do odcienia:

To jest trochę skomplikowane, ponieważ po lewej stronie Ręka strony twojego widma wydaje się fioletowa, a czerwona po prawej. W HSL czerwony jest na pozycji 0. Będziesz musiał odwrócić oś X, aby czerwony był równy 0, a fioletowy - wysoki. Możesz to uzyskać, mówiąc w zasadzie: value := MAX_VALUE - value;

Następnie musisz skalibrować linię. Ustaw długość fali odpowiadającą pełnej czerwieni równej 0, a daleki niebieski - równy temu, który ma odpowiadający jej odcień. (Jeśli możesz przekształcić długość fali na kolor TColor, a następnie TColor na HSL, który nie powinien być trudny do obliczenia). To jest twój zasięg i musisz znormalizować wszystkie długości fal, aby pasowały do ​​tego zakresu.

Po prostu na oko, wygląda na to, że lewy koniec widma przykładowego ma około 270 stopni odcień na kole barw, co równa się 192 w skali od 0 do 255. Więc spektrum należy przyjąć z czerwonego na niebieski - ponownie, pamiętaj, że kolor czerwony to LOW, a nie HIGH - i znormalizuj go do zakresu 0--192 (lub jakiejkolwiek rzeczywista wysokiej wartości) i masz swoją wartość H.

Ponadto, jeśli masz jakieś kolory na prawym końcu linii kolorów, które wykraczają poza pełną czerwoną kierunku purpury trochę, wtedy będziesz mieć negatywny odcień, który owija się wokół z powrotem do 255.

+0

Rzeczywiście mam funkcję (w bardzo ładnej bibliotece komponentów SDL), która konwertuje HSI na RGB: procedura HSItoRGB (Hue, Sat, Intens: double, var r, g, b: integer); Więc moim problemem jest jak przejść z WaveLength do HSI ?! – RobertFrank

+0

Całkiem proste w rzeczywistości. Oblicz różnicę między długością fali 0 i barwą 0, a następnie znormalizuj oś x do zakresu 0..255, a to twoja H. Normalizuj oś Y do 0..255, a to twoja L. S jest zawsze 255 , aby uzyskać jasne, żywe kolory, które pokazuje twój przykład. –

+0

Dzięki, Mason! Nadal nie wiesz, jak odwzorować długość fali (lub częstotliwość światła) na odcień ... – RobertFrank

1

Masz dokładnie to, czego potrzebujesz w tym Delphi library od efg.
Ale naprawdę powinieneś najpierw przeczytać artykuł o Widocznym świetle widma: Spectra.
"Celem tego programu jest wyświetlanie kolorów RGB jako funkcji długości fali światła widzialnego (od 380 do 780 nm)."

Jedyną modyfikacją, którą należy dodać, jest modulowanie intensywności. Ale, jak zasugerował Mason, przechodzenie przez reprezentację HSI ułatwia dostosowanie Intensywności: więc szybkie i złe rozwiązanie polega na tym, że gdy uzyskasz RGB od długości fali, aby przekonwertować na HSI, dostosuj I, a następnie powróć do RGB.

Powiązane problemy