|
Fargar i Pascal
Denne sida lister opp dei fleste rutinane som har med fargar å gjere. Bare dei funksjonane og
prosedyrane eg har brukt i ein eller annan samanheng er nærare omtalte.
Fargehandtering
Er det bare snakk om å setje ein bestemt skrift- eller teiknefarge, vil det som oftast vere nok å skrive inn den
ønskte fargen anten med standardnamn eller som hexkode. Fargerutinane er for deg som ønskjer å la programmet
modifisere fargane. Som oftast blir fargen då lagra i ein variabel av type
TColor. For eksempel var farge: TColor.
Så kan du lagre t.d. teiknefargen med kommandoen farge := Canvas.Pen.Color;.
RGBToColor(r,g,b)
Denne rutinen blir brukt til å definere ein farge ut frå verdiane for raudt, grønt og blått. Verdiane blir skrivne
som vanlege tal, dvs. som 0…255 eller som hexkode $00…$FF. Eksempel på bruk:
var
r,g,b: Byte;
farge: TColor;
begin
r := 80; g := 128; b := 240;
farge := RGBToColor(r,g,b);
end;
Definisjon: (unit Graphics)
function RGBToColor(R:Byte; G:Byte; B:Byte): TColor;
ColorToRGB(farge)
Denne funksjonen omformar ein farge i BGR-format til RGB-format.
var
farge1, farge2: TColor;
begin
farge1 := clSilver;
farge2 := ColorToRGB(farge1);
end;
Dersom farge1 er i RGB-format frå før, skjer det ingen forandring.
Definisjon: (unit Graphics)
function ColorToRGB(Color: TColor):TColor;
HLStoColor(H,L,S)
Omformar ein farge definert i fargesystemet HLS til same fargen definert i RGB. I HLS er H verdien for
«Hue» (altså kulør), L er verdien for «Luminance» (lysstyrke) og S er «Saturation» (fargemetning). Lazarus
definerer HLS anleis enn det som er vanleg. Eg har ikkje kontrollert om ein farge definert i HLS i Lazarus blir
den same fargen i andre program.
(Funksjonen ColorHLSToRGB(H,L,S) gjer akkurat det same. Er tatt med for å
gjere Lazarus kompatibel med Delphi).
var
H,S,L: Byte;
farge: TColor;
begin
H := 255; S := 128; L := 80;
farge := HLStoColor(H,L,S);
end;
Definisjon: (unit Graphutil)
function HLStoColor(const H, L, S: Byte): TColor;
ColorToHLS(farge,H,L,S)
Omformar ein farge frå fargesystemet RGB til fargesystemet HLS. Sjå om HLS ovanfor.
var
H,S,L: Byte;
farge: TColor;
begin
farge := $a03380;
HLStoColor(farge,H,L,S);
end;
H, L og S vil nå innehalde HSL-verdiane for den gitte fargen.
For å gjere Lazarus kompatibel med Delphi, kan den same funksjonen også kallast opp med
ColorRGBToHLS(H,L,S).
Definisjon: (unit Graphutil)
procedure ColorToHLS(const AColor: TColor; out H, L,S: Byte);
ColorAdjustLuma(farge,endring,OK)
Denne funksjonen forandrar lysstyrken i bildet opp eller ned etter kva verdi som blir vald. Ein positiv
verdi gjer fargen lysare, ein negativ verdi gjer fargen mørkare. Dette verkar etter intensjonane så lenge
fargen held seg godt innføre ytterpunkta, dvs. at endringsverdien ikkje resulterer i at RGB-verdiane for den
nye fargen eigentleg skulle vore under 0 eller større enn 255.
var
farge: TColor;
endring: Integer;
OK: Boolean;
begin
farge := clAqua;
endring := -24;
farge := ColorAdjustLuma(farge, endring, OK);
end;
Variabelen OK blir ikkje brukt til noe som helst, men må vere med for å få gyldig oppkall.
Definisjon: (unit Graphutil)
function ColorAdjustLuma(clrRGB: TColor; n: Integer; fScale: Bool):TColor;
DecColor(farge,mengde)
Minskar RGB-verdiane i ein farge med ein bestemt verdi. Som oftast resulterer dette i ein mørkare farge.
(Eg har ikkkje funne noen tilsvarande «IncColor», men sjå funksjonen ovanfor).
var
farge1, farge2: TColor;
begin
farge1 := $c0c0c0;
farge2 := DecColor(farge1, 24);
end;
Definisjon: (unit Graphics)
function DecColor(AColor: TColor; AQuantity: Byte):TColor;
Red(farge), Green(farge), Blue(farge)
Desse funksjonane blir brukte for å hente ut raud-, grøn- eller blåkomponenten av ein farge (i RGB).
Eksempel (utvida utgåve av eksemplet ovanfor):
var
r,g,b: Byte;
farge: TColor;
begin
r := 80; g := 128; b := 240;
farge := RGBToColor(r,g,b);
r := Red(farge);
g := Green(farge);
b := Blue(farge);
end;
Ikkje det heilt store programmet, men det viser bruken. Funksjonane virkar ikkje på systemfargane, men ikkje alltid
elles heller. Må utforskast meir. Kanskje er neste funksjon sikrare?
Definisjon: (unit Graphics)
function Red(rgb: TColor): Byte;
function Green(rgb: TColor): Byte;
function Blue(rgb: TColor): Byte;
RedGreenBlue(farge,R,G,B)
Denne prosedyren returnerer raud-, grøn- og blå-verdien for den aktuelle fargen.
var
r,g,b: Byte;
farge: TColor;
begin
farge := $c0c0c0;
RedGreenBlue(farge,r,g,b);
end;
Variablane r,g og b inneheld nå verdiane for dei aktuelle grunnfargane.
Definisjon: (unit Graphics)
procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte);
ColorToString(farge)
Dersom fargen er mellom dei som har standard fargenamn, vil funksjonen returnere fargenamnet. Dersom
fargenamnet er ukjendt, kjem fargeverdien i staden.
var
namn: String;
farge: TColor;
begin
namn := ColorToString(farge);
end;
Er fargen innan standardfargane, vil namn innehalde t.d. clMaroon. Er fargen
utanfor standardfargane, vil verdien bli lagt inn i staden, t.d. $00002288.
(Den første hexgruppa har med gjennomsikt og slikt å gjere).
Definisjon: (unit Graphics)
function ColorToString(Color: TColor):AnsiString;
StringToColor(streng)
Omformar ein fargekode oppgitt i BGR-format i ein streng til farge. Koden kan skrivast som vanlege desimaltal eller som
hexkode, då med $ framføre. Fargekode '$8050F0' og
'15749248' vil såleis gi same fargen. (Det er same talet skrive i to ulike format).
var
kode: String;
farge: TColor;
begin
kode := '$8050F0';
// Hugs BGR-formatet
farge := StringToColor(kode);
end;
Definisjon: (unit Graphics)
function StringToColor(const S: shortstring): TColor;
ColorToIdent(farge,namn)
Denne funksjonen returnerer True og fargenamnet viss fargen er ein av
standardfargane. Er fargen ikkje standard, returnerer funksjonen False
utan noen verdi for fargen.
var
namn: String;
farge: TColor;
begin
if (ColorToIdent(farge,namn) = True) then
Canvas.TextOut(10,30,'Fargen '+ namn +' er i bruk.')
else
Canvas.TextOut(10,30,'Fargen er ikkje standard');
end;
Definisjon: (unit Graphics)
function ColorToIdent(Color: Longint; var Ident: String): Boolean;
IdentToColor(namn,verdi)
Denne funksjonen returnerer True og fargeverdien viss fargen er ein av
standardfargane. Er fargen ikkje standard, returnerer funksjonen False
utan noen verdi for fargen. I eksemplet nedanfor vil variabelen f ha den verdien
den hadde før oppkallet dersom fargen ikkje er standard.
var
namn: String;
f: Integer;
begin
if (IdentToColor(namn,f) = True) then
Canvas.TextOut(10,30,'Fargen '+ namn +' har verdien '+ IntToStr(f)')
else
Canvas.TextOut(10,30,'Farge: '+ namn +' ikkje funne');
end;
Ved eventuelt funn blir fargeverdien returnert som ein verdi i titalsystemet. Dette er nokså uforståeleg. Fargen «clSkyBlue»
har desimalverdien 15 780 518, medan fargen «clSilver» har verdien 12 632 256. Som oftast vil samanhengen
mellom fargane vere enklare å sjå dersom utskrifta er i hexkode. Sjå om dette i omtalen av
hex-kode
Definisjon: (unit Graphics)
function IdentToColor(const Ident: String; var Color: LongInt): Boolean;
Farge og pikslar
Det er også råd å hente eller setje fargen på ein bestemt piksel på skjermen. Dette gjer du med kommandoen
Canvas.Pixels i det aktuelle elementet.
var
farge: TColor;
begin
farge := Form1.pnlMelding.Canvas.Pixels[x,y];
// Hent farge
Form1.pnlMelding.Canvas.Pixels[x,y] := farge;
// Sett farge
var
x og y er koordinata for pikselen som skal ha farge eller det skal hentast farge frå. Legg merke til at koordinata
blir skrivne i hakeparentes. Kommandoen høyrer eigentleg heime under «Canvas», og er omtalt der også
i avsnittet Pixels
Definisjon: (unit Graphics)
public property TCanvas.Pixels: TColor
read GetPixel
write SetPixel;
Andre fargerutinar
Lazarus har fleire rutinar for å handtere fargar. Lista viser dei eg har funne men ikkje brukt. I tillegg finst det mange
rutinar for bildehandtering. Kanskje eg kjem tilbake til desse seinare. Førebels har eg ikkje brukt dei.
Frå lazarus/lcl/graphics.pp:
Frå lazarus/lcl/GraphUtil.pp:
For å gjere Lazarus Delphikompatibel. (Skal normalt ikkje brukast):
|