Algorytm mieszania kolorow?

0

Hmm.. ostatnio natknalem sie na problem z kolorami.
Chcialem napisac procedurke ktora rysuje mi ramke o jakistam wspolrzednych, ktora bedzie migac poprzez plynną zmiane poziomu jasnosci danego koloru(mam nadzieje ze nadarzacie...;), jednakze nie wiem jakim algorytmem mam sie kierowac przy zmianach poszczegolnych bajtow odpowiadajacych za kolor.
Doszedlem jedynie do tego jak rozjasniac trzy podstawowe kolory:
czerwony #FF0000
zielony #00FF00
niebieski #0000FF
tutaj sprawa jest prosta bo wystarczy zmieniac wartosci bajtow ktore teraz sa rowne 0
ale w przypadku jakiegos koloru nieskladowego gubie sie...:(

Moze mi ktos pomoc?

A moze jest w Delphi jakas funkcja zmieniajaca stopien jasnosci danego koloru?

Prosze o pomoc.--take care,

Wodzu

0

wydaje mi sie, ze to bedzie jakos tak (dedukcja ze sposobu dzialanie colordialog)

$FF0000 odpowiada czerwonemu o nasceniu 240 (w skali 0-240) i jasnosci sredniej = 120 (0-240 tez)

zeby przyciemniac zmniejszaj to $FF. np jasnosc 119 - R=253 (sorry za porzucenie hexa), jasnosc 80 - 170 , jasnosc 40 - 85,jsanosc 0 - 0 (i masz czarny)

do rozjasniania zostaw czerwoy $FF i w tym samym stopniu zwiekszaj G i B. Np jasnosc 150: czerwony 255, G i B po 64. itd az do $FFFFFF=bialy--Pawel {Delphi6 }

Po pierwsze: naciśnij F1

0

pq, to z przyciemnianiem tez wydedukowalem jednakze stosuajc ten algorytm, przyciemnianie jak i rozjasnianie dziala poprawnie tylko dla kolorow ktore podalem. Dla innych juz nie:(

ale dzieki za pomoc,

Ps. tak dla dokladnosci to $FF0000 odpowiada czerwonemu o nasyceniu 255 i jasnosci 128.--take care,

Wodzu

0

nie wiem czy o to dokladnie chodzi ale kiedys jak bawilem sie w gradienty to doszedlem do napisania/przepisana/pozmieniania procedurki z jakiegos komponentu do rysowania gradientowych Shape'ow :)
jak znajde i poprawie bledy to napisze ja tutaj na forum hehe :)---=-=[ Delphi 3, 6 ]=-=-
-=-=-==[ LKS ]==-=-=-
-=[ [email protected] ]=-

0

&gtPs. tak dla dokladnosci to $FF0000 odpowiada czerwonemu o nasyceniu 255 i jasnosci 128.

A w moim ColorDialog jest 120. Zdziwilo mnie, spodziewalem sie 128, ale tak jest.

--Pawel {Delphi6 }

Po pierwsze: naciśnij F1

0

znalazlem i poprawilem bledy (kilka ich bylo) oto kod:
procedure WyliczKolory(KolorPoczatkowy,
KolorKoncowy: TColor);
var
BeginRGB: array[0..2] of Byte;
RGBDifference: array[0..2] of Integer;
i: Integer;
R, G, B: Byte;
begin

BeginRGB[0] := GetRValue(ColorToRGB(KolorPoczatkowy));
BeginRGB[1] := GetGValue(ColorToRGB(KolorPoczatkowy));
BeginRGB[2] := GetBValue(ColorToRGB(KolorPoczatkowy));

RGBDifference[0] := GetRValue(ColorToRGB(KolorKoncowy)) - BeginRGB[0];
RGBDifference[1] := GetGValue(ColorToRGB(KolorKoncowy)) - BeginRGB[1];
RGBDifference[2] := GetBValue(ColorToRGB(KolorKoncowy)) - BeginRGB[2];

for i := 0 to 255 do
begin
R := BeginRGB[0] + MulDiv(i, RGBDifference[0], 255);
G := BeginRGB[1] + MulDiv(i, RGBDifference[1], 255);
B := BeginRGB[2] + MulDiv(i, RGBDifference[2], 255);
Colors[i] := RGB(R, G, B); * zmienna Colors to globalna tablica [0..255] kolorow
end;
end;

tablice Colors deklarujemy w ten sposob (np. w sekcji private):
Colors : array[0..255] of TColor;

no i teraz po wykonaniu np.:
WyliczKolory( clSilver, clWhite); *dla rozjasnienia
WyliczKolory( clSilver, clBlack); //dla przyciemnienia

w tablicy globalnej - Colors beda wszystkie kolorki :)

p.s.chyba nic nie pomieszalem
p.s.2. jak chodzilo o cos innego to przepraszam :)---=-=[ Delphi 3, 6 ]=-=-
-=-=-==[ LKS ]==-=-=-
-=[ [email protected] ]=-

0

Chodzilo dokladnie o to!:)

Dzieki, nie mialem pojecia o istnieniu takiej funkcji jak MulDiv.

jak zwykle jestes nieoceniony;)--take care,

Wodzu

1 użytkowników online, w tym zalogowanych: 0, gości: 1