Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Farbwert verdunkeln bzw. aufhellen (https://www.delphipraxis.net/39283-farbwert-verdunkeln-bzw-aufhellen.html)

Opa Knack 31. Jan 2005 12:35


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

Dax 31. Jan 2005 12:44

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:
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;
Keine Funktionalität garantiert ;-)

sakura 31. Jan 2005 12:46

Re: Farbwert verdunkeln bzw. aufhellen
 
Zitat:

Zitat von Dax
Aufhellen beziehungsweise Abdunkeln ist leichter, als manche denken ;-)

So leicht dann doch nicht ;-) Mann sollte nicht alle Werte gleichmäßig (an 255) behandeln, sondern prozentual vom Ausgangswert, sonst gibt es eine unangenehme Verschiebung des Hue.

...:cat:...

Binärbaum 31. Jan 2005 13:05

Re: Farbwert verdunkeln bzw. aufhellen
 
Ich hätte da eine Idee, wie mann das realisieren kann:
Delphi-Quellcode:
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;
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.
(Achtung: ungetestet!)

MfG
Binärbaum

Binärbaum 31. Jan 2005 16:28

Re: Farbwert verdunkeln bzw. aufhellen
 
Analog dazu kann man Farben heller machen:
Delphi-Quellcode:
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;
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)

MfG
Binärbaum

moritz 31. Jan 2005 20:00

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:
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;
Mit dem Heller machen ist das Leider nicht so einfach.

Gruß, Moritz

Keldorn 1. Feb 2005 19:32

Re: Farbwert verdunkeln bzw. aufhellen
 
es gibt auch eine Delphi-Funktion: Hier im Forum suchenColorAdjustmentLuma aus der unit graphutil. hier gehen die Abdunklungen/Aufhellungen richtig in der Farbe weiter und eneden nicht in einem grau/weiß-matsch.

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