![]() |
Farbwert verdunkeln bzw. aufhellen
Hallo,
diese Frage ist zwar schon x-Mal gestellt worden, aber die Antworten kann ich alle nicht umsetzen: Ich möchte gerne eine "Hell-Dunkel"-Scrollbar vglb. dem Standard-Windows-Farbauswahldialog erstellen, sprich von einer beliebigen Farbe ausgehend deren Abstufungen hin zu Weiß bzw. Schwarz darstellen und auswählen können. Gibt es für sowas eine Komponente? Oder kann ich den Source dazu irgendwo finden? Vieles von dem, was ich bisher gefunden habe, verfolgt zwar die gleiche Idee, aber die Umsetzung ist trotzdem jedesmal anders. Danke Opa |
Re: Farbwert verdunkeln bzw. aufhellen
Aufhellen beziehungsweise Abdunkeln ist leichter, als manche denken ;-)
Das Prinzip ist folgendes: Zu jeder Komponente (Rot, Grün, Blau) der Farbe wird ein Wert hinzugefüg oder abgezogen. Hier mal ein Beispielcode:
Delphi-Quellcode:
Keine Funktionalität garantiert ;-)
function Darken(C: TColor): TColor;
var T: TColor; begin T := ColorToRGB(C); Result := ((T and $FF) + $01) or ((T and $FF00) + $0100) or ((T and $FF0000) +$010000); end; |
Re: Farbwert verdunkeln bzw. aufhellen
Zitat:
...:cat:... |
Re: Farbwert verdunkeln bzw. aufhellen
Ich hätte da eine Idee, wie mann das realisieren kann:
Delphi-Quellcode:
Der Parameter Prozent muss dabei im Bereich von 0..100 liegen und gibt das Maß der Abdunklung an. Bei 0 ist der Rückgabewert schwarz, bei 100 die Farbe selbst, und sonst halt dazwischen.
function Dunkel(farbe: TColor; prozent: Byte): TColor;
var c: array [0..2] of Byte; i: Integer; begin c[0]:= (farbe and $FF); c[1]:= (farbe and $FF00) shr 8; c[2]:= (farbe and $FF0000) shr 16; for i:= 0 to 2 do c[i]:= (c[i]* prozent) div 100; Result:= c[0] + (c[1] shl 8) + (c[2] shl 16); end; (Achtung: ungetestet!) MfG Binärbaum |
Re: Farbwert verdunkeln bzw. aufhellen
Analog dazu kann man Farben heller machen:
Delphi-Quellcode:
Prozent liegt hier im Bereich von 0 bis 255. Bei einem Wert von 0 erhält man die Farbe selbst, bei 100 ist das Ergebnis eine doppelt so helle Farbe. (ebenfalls ungetestet)
function Heller(farbe: TColor; prozent: Byte): TColor;
var c: array [0..2] of Word; i: Integer; begin c[0]:= (farbe and $FF); c[1]:= (farbe and $FF00) shr 8; c[2]:= (farbe and $FF0000) shr 16; for i:= 0 to 2 do begin c[i]:= (c[i]* (100 + prozent)) div 100; if c[i]>255 then c[i]:= 255; end; Result:= c[0] + (c[1] shl 8) + (c[2] shl 16); end; MfG Binärbaum |
Re: Farbwert verdunkeln bzw. aufhellen
Hab mich heute mal intersssehalber hingesetzt, um das zu optimieren :mrgreen:
Herausgekommen sind folgende Funktionen (Mit Unterstützung von Dax und Muetze1!) Eregbnise der Zeitmessung für 1 Million Durchläufe: Binärbaum's Funktion: 109 ms Pascal Funktion: 94 ms (Darken()) Assembler-Funktion: 63 ms (Darken2()) Die Funktionen:
Delphi-Quellcode:
Mit dem Heller machen ist das Leider nicht so einfach.
function Darken(Value: TColor; Percentage: Byte): TColor;
type PP = ^DWord; var Buffer: Array[0..3] of Byte; I: Integer; begin PP(@Buffer)^ := Value; for I:=0 to 2 do Buffer[I] := (Buffer[I] * Percentage) DIV 100; Result := PP(@Buffer)^; end; function Darken2(Value: TColor; Percentage: Byte): TColor; var Buffer: Array[0..3] of Byte; asm PUSHA MOV EBX, Value XOR ECX, ECX MOV CX, 3 @@CLC: MOV AL, BL MUL Percentage MOV DL, $64 DIV DL MOV byte ptr buffer[3], al SHR buffer, 8 SHR EBX, 8 LOOP @@CLC POPA MOV EAX, Buffer end; Gruß, Moritz |
Re: Farbwert verdunkeln bzw. aufhellen
es gibt auch eine Delphi-Funktion:
![]() Mfg Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz