Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - [VisualCLX] Grafiken einfärben
Experience1986 - Sa 02.07.05 14:26
Titel: Grafiken einfärben
Hi,
ich suche eine möglichkeit um in meinem Programm Grafiken zur Laufzeit einzufärben. Bislang habe ich immer eine Färben Prozedur verwendet:
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); 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 - Mo 04.07.05 00:19
Moin!
Experience1986 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?
Experience1986 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 - 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 - Mo 04.07.05 21:39
Moin!
Experience1986 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:
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:
Delphi-Quelltext
1:
| Pixels[x,Y]:=RGB(Gr,0,0); |
zu setzen, kannst du doch auch den Grauwert als maximale Helligkeit absolut ansetzen:
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 - 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
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);
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!