Tilbake til startsida IKT i praksis - Pascal

Meny
 
 
 
 
 
Rutinar
 
 
 
 
 

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:

  • function IdentEntry(Entry: Longint; var MapEntry: TIdentMapEntry): boolean;
  • function ColorIndex(Color: Longint; var Index: Integer): Boolean;
  • function SysColorToSysColorIndex(Color: TColor): integer;
  • procedure GetColorValues(Proc: TGetColorStringProc);
  • function InvertColor(AColor: TColor): TColor;
  • function FPColorToTColor(const FPColor: TFPColor): TColor;
  • function TColorToFPColor(const c: TColor): TFPColor;
  • function ColorToGray(const AColor: TColor): Byte;

Frå lazarus/lcl/GraphUtil.pp:

  • function ColorToGray(const AColor: TColor): Byte;
  • procedure RGBtoHLS(const R, G, B: Byte; out H, L, S: Byte);
  • procedure HLStoRGB(const H, L, S: Byte; out R, G, B: Byte);

For å gjere Lazarus Delphikompatibel. (Skal normalt ikkje brukast):

  • procedure ColorRGBToHLS(clrRGB: COLORREF; var Hue, Luminance, Saturation: Word);
  • function ColorHLSToRGB(Hue, Luminance, Saturation: Word): TColorRef;
  • function ColorAdjustLuma(clrRGB: TColor; n: Integer; fScale: BOOL): TColor;
  • function GetHighLightColor(const Color: TColor; Luminance: Integer = 19): TColor;
  • function GetShadowColor(const Color: TColor; Luminance: Integer = -50): TColor;

Send melding

© Innhald og design:  Kolbjørn StuestølStuestøl heimesideSist endra 11. april 2013