Autor Beitrag
Experience1986
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Sa 02.07.05 14:26 
Hi,

ich suche eine möglichkeit um in meinem Programm Grafiken zur Laufzeit einzufärben. Bislang habe ich immer eine Färben Prozedur verwendet:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure Faerben(C:TCanvas);
var x, y: integer;
  Color: LongInt;
  R, G, B, Gr: Byte;
begin
  with C do
    for x:= ClipRect.Left to ClipRect.Right do
      for y:= ClipRect.Top to ClipRect.bottom do
      begin
        Color:=ColorToRGB(Pixels[x,Y]);

        R := GetRValue(Color);
        G := GetGValue(Color);
        B := GetBValue(Color);

        Gr := Trunc(B*0.11+G*0.59+R*0.3);

        //************************* 
        Pixels[x,Y]:=RGB(Gr,0,0);
        // Pixels[x,Y]:=RGB(0,0,Gr); -> Blau
        //*************************
      end;
end;



Leider geht diese von der Ursprünglichen Farbe der Grafiken aus, wodurch ich nur geringe Farbspektren darstellen kann.


Wie müsste ich denn vorgehen wenn ich so färben möchte wie das etwa der windows media player tut?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 04.07.05 00:19 
Moin!

user profile iconExperience1986 hat folgendes geschrieben:
Leider geht diese von der Ursprünglichen Farbe der Grafiken aus, wodurch ich nur geringe Farbspektren darstellen kann.

Korrekter wäre die Feststellung, dass dein Code von der subjektiven Helligkeit ausgeht. Aber was hindert dich, andere Maßstäbe anzulegen?

user profile iconExperience1986 hat folgendes geschrieben:
Wie müsste ich denn vorgehen wenn ich so färben möchte wie das etwa der windows media player tut?

Dazu wäre interessant, was denn dieser tut, bzw. wie du dir das Färben denn konkret vorstellst? Du kannst doch praktisch jede beliebige Farbe mit dem Helligkeitswert skaliert als Basis nehmen... :gruebel: wo ist dein Problem?

cu
Narses
Experience1986 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: Mo 04.07.05 17:34 
Genau das kann ich eben nicht. Ich kann leider nur ein gewisses Farbspektrum mit dieser Methode darstellen, aber ich möchte es so haben wie der windows media player. Dieser kann alle möglichen farben anzeigen.

Und wie ich so den Code modifizieren soll, weis ich auch nicht. Deshalb habe ich ja dieses Thread eröffnet.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 04.07.05 21:39 
Moin!

user profile iconExperience1986 hat folgendes geschrieben:
Ich kann leider nur ein gewisses Farbspektrum mit dieser Methode darstellen

Reichen ungefähr 16,7 Millionen Farben nicht? :wink: (ja, für die Besserwisser, bei der Methode ist der Farbraum auch eingeschränkt, ich weiß; andererseits zeige man mir einen "Färbungs-Algo", der diese Einschränkung nicht hat!)

Also, hier:
ausblenden Delphi-Quelltext
1:
Gr := Trunc(B*0.11+G*0.59+R*0.3);					

berechnest du den Grauwert, oder eben die subjektive Helligkeit. Jetzt nimmst du eine beliebige Farbe, zerlegt in ihre Bestandteile (rneu,gneu,bneu). Anstatt:
ausblenden Delphi-Quelltext
1:
Pixels[x,Y]:=RGB(Gr,0,0);					

zu setzen, kannst du doch auch den Grauwert als maximale Helligkeit absolut ansetzen:
ausblenden Delphi-Quelltext
1:
Pixels[X,Y] := RGB(Trunc(rneu*Gr/255),Trunc(gneu*Gr/255),Trunc(bneu*Gr/255));					

wobei du hier die Helligkeit der neuen Farbe ausser acht läßt. Alternativ könnte man noch mit der subjektiven Helligkeit der neuen Farbe skalieren und damit "helligkeitsrichtig" färben, aber das kannste dann auch selbst rausfinden. :wink:

cu
Narses
Experience1986 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 192

Win XP Pro SP2
Delphi 7
BeitragVerfasst: So 26.02.06 14:43 
so. Erst mal Danke für deine Antwort. Und zugleich ein dickes Sorry das ich jetzt erst antworte. (Hatte die ganze Zeit kein Internet und muss dieses Thema so übersehen haben).

Ich muss gerade feststellen, das der Code den ich oben gepostet hatte, ein Anderer ist, als den den ich nutze

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure Faerben(C:TCanvas;PercR,PercG,PercB:Integer);
var x, y: integer;
  Color: LongInt;
  R, G, B: Byte;
begin
  with C do
    for x:= ClipRect.Left to ClipRect.Right do
      for y:= ClipRect.Top to ClipRect.bottom do
      begin
        Color:=ColorToRGB(Pixels[x,Y]);

        R := GetRValue(Color);
        G := GetGValue(Color);
        B := GetBValue(Color);

        //** Wie diese nachfolgende Zeile funktioniert, weiß ich nicht **//
        //** ist aber wohl die wichtigste Zeile in der Prozedur *g* **//
        Pixels[x,Y]:=RGB(trunc(R*(PercR/100)),trunc(G*(PercG/100)),trunc(B*(PercB/100)));
        //*************************
      end;
end;


Ich weiß leider immer noch nicht wie sich die Farben so zusammensetzen lassen. Ich kann daher auch nichts selbst an diesem Code ändern. Wäre also gut wenn sich einer bereit erklären würde, mir zu erklären wie man hier die "Helligkeitsoption" einbauen kann.

Danke schon mal im Voraus.