Wie Füllfarbe zum Hintergrund kontrastierend machen?

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Wie Füllfarbe zum Hintergrund kontrastierend machen?

Beitrag von br_klaus »

Hallo,

wie kann ich (in OnPaint) beim Malen eines Grafikobjekts (Polygon, Rechteck, Kreis, Linie, etc.) die Farbe so einstellen, daß jedes Pixel zum Hintergrund kontrastiert (weiß bei dunhel, schwarz bei hell)? Geht das nur pixelweise (da habe ich auf http://www.s170867368.online.de/delphi/fhd.php" onclick="window.open(this.href);return false; eine Funktion gefunden) oder gibt es da auch eine andere, evtl. schnellere Möglichkeit?

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Wie Füllfarbe zum Hintergrund kontrastierend machen?

Beitrag von mschnell »

AFAIK gibtt es die Möglichkeit beim Malen die Methodik "XOR" anzugeben. Dann erzeugt weiß eine Komplementär-Farbe.

-Michael

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wie Füllfarbe zum Hintergrund kontrastierend machen?

Beitrag von corpsman »

ich mach immer xor $00010101 oder so, ein

rgb(255- getrvalue(color), 255- getgvalue(color),255- getbvalue(color))

wäre aber der falsche weg, da sonst Grau nach Grau portiert wird ( da Grau R,g,b = 128 )
--
Just try it

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Wie Füllfarbe zum Hintergrund kontrastierend machen?

Beitrag von u-boot »

Nun ich würde probieren für jede Farbe in RGB 128 zu addieren und wenns größer ist als 255 einfach 256 abziehen.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Wie Füllfarbe zum Hintergrund kontrastierend machen?

Beitrag von MAC »

Die methode von corpsman kann man novh vereinfachen:

Code: Alles auswählen

negativ := 16777215 - color

Code: Alles auswählen

Signatur := nil;

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Wie Füllfarbe zum Hintergrund kontrastierend machen?

Beitrag von br_klaus »

Habe im Internet (bei delhpi-treff.de folgende Funktion für den Grauwert einer Farbe gefunden:

Grau(RGB-Farbe) = R * 0.297 + G * 0.589 + B * 0.114 = (R * 77 + G * 150 + B * 29) div 256

mit Assembler ginge es so:

Code: Alles auswählen

{$ASMMODE Intel}
 
.....
 
function Grau(col:TColor):TColor; Assembler;
    // Grau(RGB-Farbe) =  R * 0.297 + G * 0.589 + B * 0.114 =
    // = (R * 77 + G * 150 + B * 29) div 256
     asm
      // ebx = Farbe, edx = Endsumme, eax = Farbkanal
        mov ebx,col // (.BGR)
        xor edx,edx
    @R_77:
       or bl, bl; jz @G_150  
       xor eax,eax
       mov al,bl; add edx,eax // 1
       shl eax,2; add edx,eax // +4=5
       shl eax,1; add edx,eax // +8=13
       shl eax,3; add edx,eax // +64=77
    @G_150:
       shr ebx,8; or bl,bl; jz @B_29  //  ebx = (..BG)
       xor eax,eax
       mov al,bl; shl eax,1; add edx,eax  // 2
       shl eax,1; add edx,eax // +4=6
       shl eax,2; add edx,eax // +16=22
       shl eax,3; add edx,eax // +128=150
    @B_29:
       shr ebx,8; or bl,bl; jz @Ret   // ebx = (...B)
       xor eax,eax
       mov al,bl; add edx,eax // 1
       shl eax,2; add edx,eax // +4=5
       shl eax,1; add edx,eax // +8=13
       shl eax,1; add edx,eax // +16=29
    // div 256
    @Ret:
       mov eax,edx; shr eax,8    // div 256 = Ergebnis
     end;

Antworten