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?
Wie Füllfarbe zum Hintergrund kontrastierend machen?
-
- 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?
AFAIK gibtt es die Möglichkeit beim Malen die Methodik "XOR" anzugeben. Dann erzeugt weiß eine Komplementär-Farbe.
-Michael
-Michael
- 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?
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 )
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
Just try it
-
- 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?
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)
-
- 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?
Die methode von corpsman kann man novh vereinfachen:
Code: Alles auswählen
negativ := 16777215 - color
Code: Alles auswählen
Signatur := nil;
-
- 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?
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:
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;