Jak narysować Gradient
Coldpeer
function Gradient(Uklad: Boolean; Kolor1, Kolor2: TColor; Szerokosc, Wysokosc: Integer) : TBitmap;
var
i, j, x, y, dr, dg, db, dlugosc : Integer;
r, g, b, r2, g2, b2, DodR, DodG, DodB : Real;
Bitmapa : TBitmap;
begin
Bitmapa := TBitmap.Create;
Bitmapa.Width := Szerokosc;
Bitmapa.Height := Wysokosc;
r := GetRValue(Kolor1);
g := GetGValue(Kolor1);
b := GetBValue(Kolor1);
r2 := GetRValue(Kolor2);
g2 := GetGValue(Kolor2);
b2 := GetBValue(Kolor2);
dr := Round(r2) - Round(r);
dg := Round(g2) - Round(g);
db := Round(b2) - Round(b);
if Uklad
then
begin
dlugosc := Szerokosc;
x := Szerokosc - 1;
y := Wysokosc - 1;
end
else
begin
dlugosc := Wysokosc;
y := Szerokosc - 1;
x := Wysokosc - 1;
end;
if dr = 0
then DodR := 0
else DodR := dr / dlugosc;
if dg = 0
then DodG := 0
else DodG := dg / dlugosc;
if db = 0
then DodB := 0
else DodB := db / dlugosc;
for i := 0 to x do
begin
for j := 0 to y do
begin
if Uklad
then Bitmapa.Canvas.Pixels[i , j] := RGB(Round(r) , Round(g) , Round(b))
else Bitmapa.Canvas.Pixels[j , i] := RGB(Round(r) , Round(g) , Round(b));
end ;
if ((DodR > 0) and (r < r2)) or ((DodR < 0) and (r > r2)) then r := r + DodR;
if ((DodG > 0) and (g < g2)) or ((DodG < 0) and (g > g2)) then g := g + DodG;
if ((DodB > 0) and (b < b2)) or ((DodB < 0) and (b > b2)) then b := b + DodB;
end ;
Result := Bitmapa;
end;
Wywołanie:
Metoda 1
Powoduje wczytane gradientu do komponentu Image
Image1.Picture.Bitmap := Gradient(True, $00DBFBFF, $005FC8FB, Image1.Width, Image1.Height);
Metoda 2
Powoduje wczytanie gradientu do zmiennej typu Bitmap
BMP := TBitmap.Create;
BMP := Gradient(False, $00DBFBFF, $005FC8FB, 200, 30);
Canvas.Draw(10, 10, BMP);
BMP.Free;
Lub z JediVCL użyć komponentu JVGradient
Mam propozycję. Może lepiej by było to zrobić na ScanLine?