![]() |
Rechenproblem
Hallo,
ich schreibe an einem Programm und es soll möglich sein eigene Designs zu erstellen. Es soll 2 Arten von Designs geben: Feste (Graphiken werden geladen und einfach übernommen) (Kein Problem) Farbveränderbare (Graphiken sind nur in Graustufen und werden mit einer einstellbaren Farbe gefärbt) (Hier habe ich das Problem) Ich hätte gerne, dass die Farbberechnung folgende bedingungen erfüllt: IN = ein Kanal der Wunschfarbe des Benutzers (RGB-Farbe) MASK = Helligkeit der Maske (0-255) OUT = Ausgangswert des Kanals für die Anzeige wenn MASK = 0 dann OUT = 0 ? wenn MASK = 128 dann OUT = IN ? wenn MASK = 255 dann OUT = 255 Ich habe jetzt das Problem, dass ich nicht weiß, wie ich den Ausgabewert (OUT) für die MASK-Werte zwischen 0 und 128 (128 und 255) berechne. (da wo die "?" sind) Es soll dort ein gleichmäßiger Farbverlauf zu Weiß (in Richtung MASK =255), bzw. zu Schwarz (in Richtung MASK =0) entstehen. Um es einfach auszudrücken die Farbe soll abgedunkelt oder aufgehellt werden, je nach Helligkeit der Maske. Ich will erreichen, das Weiß in der Maske auch Weiß in der Ausgabe ist, das gleiche gilt für Schwarz. 50%iges Grau soll genau die Wunschfarbe des Benutzers sein. Ich brauch also eine Formel um das Ganze zu berechnen. Ich habe schon einiges Versucht und bin auf keine Lösung gekommen. Irgendwie habe ich da eine Blockade. :wall: |
Re: Rechenproblem
rein von deiner Tabelle her:
Delphi-Quellcode:
maske darf nicht größer 255 sein
if maske <= 128 then
out := round(in * (maske/128)) else out := 128 + round((maske-128)/128); |
Re: Rechenproblem
Das Problem bei Muetzes Lösung ist, dass sich dabei u.U. der jeweilige Farbeindruck mehr oder minder stark bei verändert, und der else-Zweig ist mir auch grad etwas suspekt :)
Eine sehr saubere, wenn auch nicht ganz triviale Lösung wäre es, wenn du die in-Farbe in das HLS-Farbmodell umrechnest, den L-Anteil um (Maske-128)*2 verschiebst (und bei L<0 und L>255 clippst), und das wieder nach RGB zurück wandelst. In der englischen Wikipedia ist eine ![]() Du musst nur aufpassen, dass du nicht den HSV bzw. HSB Farbraum nimmst, da dieser bei voller Helligkeit kein Weiss annimmt, HLS bzw. HSL schon. (HSV und HSB werden meist gleichbedeutend verwendet, und HLS/HSL auch.) Edit: Ich seh grad, die en. Wikipedia nennt HSB synonym zu HSL, nicht zu HSV. Das wird gerne und oft durcheinander gebracht... Richtig ist das Modell, dass durch einen Doppelkegel repräsentiert wird, nicht durch einen einfachen Kegel. Damit ists eindeutig ^^) |
Re: Rechenproblem
Zitat:
![]() Und zur Umwandlung kann ich nur immer mal wieder auf das ![]() ![]() ![]() |
Re: Rechenproblem
Vorsicht,
![]() PS: Dennoch ist mir dein else-Zweig schleierhaft. "in" geht da ja garnicht mit ein :gruebel: |
Re: Rechenproblem
Zitat:
Delphi-Quellcode:
if maske <= 128 then
out := round(in * (maske/128)) else out := 128 + round(in*((maske-128)/128)); |
Re: Rechenproblem
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Zitat:
Benutzerfarbe: Rot Maske: Farbverlauf von Schwartz nach Weiß Ergebnis sollte dann sein: Farbverlauf von Schwartz über Rot nach Weiß |
DP-Maintenance
Dieses Thema wurde von "Luckie" von "Sonstige Fragen zu Delphi" nach "Multimedia" verschoben.
Gehört wohl nach Multimedia. |
Re: Rechenproblem
Schaue er nochmal auf Beitrag 3 ;)
|
Re: Rechenproblem
Mein Problem hat sich gelöst. :coder2:
Falls jemanden die Lösung interressiert: Meine eigenen Beispieldateien habe mich darauf gebracht, das ich nur einen Farbverlauf zwischen der Wunschfarbe und Schwarz bzw Weiß zeichnen müsste und dann die gesuchte Stufe entnehmen muss. Daraus folgt:
Delphi-Quellcode:
(muss für jeden RGB-Kanal einzeln gerechnet werden)
if MASK < 128 then
OUT:= 0+round((IN-0)*MASK/128) else if MASK > 128 then OUT:= IN+round((255-IN)*(MASK-128)/128) else if MASK = 128 then OUT:=IN; basierend auf der einfachen Formel für einen Farbverlauf(hier in RGB-Zerhackter Form):
Delphi-Quellcode:
Auch wenn ich die Lösung doch noch selbst herausbekommen habe, danke ich euch für eure hilfe. :dp:
procedure GradiendColor(rstart,gstart,bstart,rend,gend,bend,pos,length:Integer;var rout:Integer;var gout:Integer;var bout:Integer;);
begin rout:=rstart+round((rend-rstart)*pos/length); gout:=gstart+round((gend-gstart)*pos/length); bout:=bstart+round((bend-bstart)*pos/length); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:23 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