AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Farbhelligkeit verändern...

Farbhelligkeit verändern...

Ein Thema von stahli · begonnen am 20. Mär 2007 · letzter Beitrag vom 21. Mär 2007
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
2.669 Beiträge
 
Delphi XE3 Ultimate
 
#1

Farbhelligkeit verändern...

  Alt 20. Mär 2007, 22:41
Hallo zusammen,

ich möchte in meiner Anwendung einige Farben heller oder dunkler machen.
Das ist zwar nicht sehr wichtig, aber ich habe mich daran etwas festgebissen.

Ich denke, das wird sicher häufiger mal gebraucht werden, daher will ich hier mal einen Thread eröffen:

Mein aktueller Stand...
- RGB-Farben können nicht einfach in der Helligkeit verändert werden
- sie müssen in ein anderes Farbsystem (Cie LAB) umgewandelt werden, das über einen eigenen Helligkeitswert verfügt
- dann wird die Helligkeit geändert
- und die Farbe wieder in RGB konvertiert

einige Links...
http://www.beta45.de/farbcodes/theorie/farbmodelle.html
http://www.informatics.occursus.de/h...ava/SyncFM.htm
http://de.wikipedia.org/wiki/Lab-Farbraum
http://www.pagus.de/seminar/skript/color.html
http://www.ikg.uni-hannover.de/publi...davg_cms_2.pdf
http://www.multitools-online.de/cont...h/fm_kap01.pdf
http://homepages.fh-giessen.de/~hg10.../Kapitel4.html
http://de.wikipedia.org/wiki/Farbmanagement
http://www.farbtipps.de/farbsysteme.html
http://www.gm.fh-koeln.de/~hstl/Doku...ie/CIELab.html

Der letzte Link enthält eine Umrechnungsformel, mit der ich aber trotzdem nicht klar komme ;-(

Was mich aber grundsätzlich daran stört:
Der Helligkeitswert L bei LAB liegt im Bereich 0..100.

Im Color-Dialog von Delphi gibt es aber einen Bereich von 0..240
Farbt. 0..239
Sätt. 0..240
Hell. 0..240
Also wird dort wohl eine andere (bessere?) Umrechnung verwendet. Eine eigene Umrechnungsfunktion sollte natürlich bestenfalls mit den „gewohnten“ Werten funktionieren.

Weiß jemand, wie diese RGB-Umrechnung funktioniert?

Eine Funktion stelle ich mir dann so vor:
Delphi-Quellcode:
NewColor:=ColorHellDif(OldColor,10); // 10 Werte heller
NewColor:=ColorHellDif(OldColor,-10); // 10 Werte dunkler
NewColor:=ColorHell(OldColor,10); // alsoluter Wert=10
Stahli
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Farbhelligkeit verändern...

  Alt 20. Mär 2007, 23:02
Hallo Stahli,

schau dir doch einmal die Unit GraphUtil an...

Gruß Hawkeye
  Mit Zitat antworten Zitat
Billi Berserker

Registriert seit: 14. Apr 2003
73 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Farbhelligkeit verändern...

  Alt 21. Mär 2007, 00:13
Also mit LAB würde ich hier nicht anfangen.
Nimm einfach das HSL (Hue, Saturation, Lightness) Modell und ändere dort die Helligkeit.
siehe auch: http://wiki.delphigl.com/index.php/Farbräume

Eine implementierung für TColor32 Werte (Graphics32) findest du hier: http://svn.sourceforge.net/viewvc/sh...as?view=markup
(den Alpha Parameter des TColor32 Wertes kannst du dir schenken, nur benutze ich überall Graphics32 - sollte aber recht einfach zu modifizieren sein)
Schau dir dort die Funktionen RGBToHSL und HSLToRGB an.

Du wandelst dann deinen RGB Wert einfach in HSL um, erhöhst den Lightness Parameter um den entsprechenden Wert und wandelst es wieder in RGB um.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
2.669 Beiträge
 
Delphi XE3 Ultimate
 
#4

Re: Farbhelligkeit verändern...

  Alt 21. Mär 2007, 00:58
Danke Euch!

Also ich habe gut 2 Tage alles mögliche zu Farben gelesen... Ist schon interessant.
Für alle, denen das etwas hilft, hier ein kleines Testprojekt mit meinen 2 Funktionen.
Damit sind Helligkeitsänderungen kein Problem (mehr).

Delphi-Quellcode:
uses
  GraphUtil; // !!

procedure TForm1.Button1Click(Sender: TObject);
begin
  ColorDialog1.Execute();
  Panel2.Color:=ColorDialog1.Color;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);

  // festen Helligkeitswert zuweisen (0=schwarz .. 240=weiß)
  function ColorLightness(clrRGB:TColor;Lightness:Integer):TColor;
  var H,L,S:Word;
  begin
    if (Lightness<0) then Lightness:=0;
    if (Lightness>240) then Lightness:=240;
    ColorRGBToHLS(ColorToRGB(clrRGB),H,L,S);
    Result:=TColor(ColorHLSToRGB(H,Lightness,S));
  end;

  // Helligkeitsdifferenz zuweisen (-240..240)
  // Wird die Helligkeit >240 oder <0 wird die Richtung umgedreht
  // bzw entsprechend begrenzt
  function ColorLightnessMove(clrRGB:TColor;Lightness:Integer):TColor;
  var H,L,S:Word;
      I:Integer;
  begin
    if (Lightness<-240) then Lightness:=-240;
    if (Lightness>240) then Lightness:=240;
    ColorRGBToHLS(ColorToRGB(clrRGB),H,L,S);
    I:=(L+Lightness);
    if (I>240) then begin
      if (L<=120) then I:=240
      else begin
        I:=(L-(I-L));
        if (I<0) then I:=0;
      end;
    end;
    if (I<0) then begin
      if (L>120) then I:=0
      else begin
        I:=(L+(L-I));
        if (I>240) then I:=240;
      end;
    end;
    Result:=TColor(ColorHLSToRGB(H,I,S));
  end;

begin
  Panel2.Caption:=IntToStr(TrackBar1.Position);
  Panel1.Color:=GetHighLightColor(Panel2.Color,TrackBar1.Position);
  Panel3.Color:=GetShadowColor(Panel2.Color,TrackBar1.Position);
  Panel4.Color:=ColorLightness(Panel2.Color,TrackBar1.Position);
  Panel5.Color:=ColorLightnessMove(Panel2.Color,TrackBar1.Position);
end;
Stahli

EDIT: Alle Maximalwerte 255 mussten natürlich in 240 geändert werden, da der Helligkeitsbereich 0..240 ist.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf