Transformacje grafiki - temat woda. Dziś postanowiłem opisać metodę zamiany kolorowego obrazka na odcienie szarości. Efekt bardzo prosty zarówno do wykonania, jak i do zrozumienia. Tyle słowem wstępu - zacznijmy więc.
>
var
x, y : integer;
r,g,b : byte;
kolor : TColor;
srednia : byte;
po słówku begin wpisujemy natomiast:
if not OpenPictureDialog1.Execute Then
Exit;
Powyższy warunek otwiera okno wyboru pliku i zakańcza procedurę jeśli użytkownik nie wybrał żadnego pliku (np. kliknął na Anuluj). Zapobiega to wczytaniu pustej ścieżki.
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
Zadaniem powyższej instrukcji jest wczytanie do komponentu Image1 pliku wybranego przez użytkownika (OpenPictureDialog1.FileName).
For y:=0 To Image1.Picture.Height-1 Do
begin
Powyższa pętla "przechodzi" przez wszystkie wiersza (linie) obrazka. Jest wykonywana od linii 0 do wartości wysokości obrazka.
for x:=0 To Image1.Picture.Width-1 do
begin
Kolejna pętla, która "przechodzi" przez wszystkie piksele danego wiersza. Jest wykonywana od 0 do wartości szerokości obrazka.
kolor := Image1.Picture.Bitmap.Canvas.Pixels[x,y];
Wyżej następuje pobranie koloru aktualnie "przerabianego" piksela i przypisanie go do zmiennej kolor.
r := GetRValue(kolor);
g := GetGValue(kolor);
b := GetBValue(kolor);
Powyżej znajdują się instrukcje odpowiedzialne za rozłożenie pobranego koloru na trzy składowe r,g,b.
srednia := Round((r+g+b) / 3);
Powyżej następuje obliczanie średniej trzech składowych.
Image1.Picture.Bitmap.Canvas.Pixels[x,y] := RGB(srednia, srednia, srednia);
end;
end;
Wyżej następuje narysowanie piksela, którego kolor stanowi obliczona wcześniej średnia.
Zawsze kolor w odcieniach szarości uzyskujemy tylko wtedy, gdy wszystkie składowe RGB mają tę samą wartość. Możemy więc napisać coś takiego:
Image1.Picture.Bitmap.Canvas.Pixels[x,y] := RGB(r, r, r);
Ale będą to odcienie szarości, nie danego koloru, ale jedynie jego czerwonego widma. Tak samo możemy zrobić odcienie szarości zielonego czy niebieskiego widma:
Image1.Picture.Bitmap.Canvas.Pixels[x,y] := RGB(g, g, g);
Odcienie szarości poszczególnych części widma różnią się od siebie. Przygotowałem dla was animacje, która ukazuje po kolei odcienie szarości poszczególnych części widma R,G,B.
Jak widać pod pojęciem odcieni szarości kryje się wiele. Nasz filtr może zwracać odcienie szarości obliczone dla wszystkich składowych (uniwersalne), lub tylko dla jednej z nich. W tym drugim wypadku odcienie szarości będą zależeć od składowej dla której sporządzamy obraz. Na powyższej animacji (na klatce która ukazuje odcienie szarości dla koloru czerwonego), możemy zwrócić uwagę, że obiekty najbardziej czerwone są koloru białego. Analogicznie sprawa wyglądałaby gdybyśmy sporządzili odcienie szarości dla niebieskiej części widma. Wówczas obiekty najbardziej niebieskie byłyby białe.
Jak zwykle do artykułu dołączam kod źródłowy pisanej aplikacji. Życzę wszystkich sukcesów w tworzeniu własnych efektów.
| Brak komentarzy |
| Nie ma jeszcze żadnych komentarzy. Jeśli chcesz, wyraź pierwszy swoje zdanie na temat tego artykułu. |
Łukasz "Lukas" Wyporek
lukas.home.page@gmail.com