Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Rechenproblem (https://www.delphipraxis.net/114588-rechenproblem.html)

Delphi-Fan-Friedrichsdorf 27. Mai 2008 23:28


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:

Muetze1 28. Mai 2008 00:07

Re: Rechenproblem
 
rein von deiner Tabelle her:

Delphi-Quellcode:
if maske <= 128 then
  out := round(in * (maske/128))
else
  out := 128 + round((maske-128)/128);
maske darf nicht größer 255 sein

Medium 28. Mai 2008 00:27

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 Formel zur Umrechnung RGB->HLS angegeben, den Rückweg hab ich noch nicht als fertige Formeln gefunden - lässt sich aber ja herleiten.

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 ^^)

Muetze1 28. Mai 2008 00:31

Re: Rechenproblem
 
Zitat:

Zitat von Medium
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 :)

Ich habe nur seine Tabelle umgesetzt. Alles andere war nicht gefragt, mir aber geläufig.

Und zur Umwandlung kann ich nur immer mal wieder auf das efg's ComputerLab verweisen. (Detail: HSV, ShowImage)

Medium 28. Mai 2008 00:34

Re: Rechenproblem
 
Vorsicht, HSV wäre eben nicht geeignet! Der Image-Viewer scheint aber was zu bieten zu haben, da er beide Modelle zur Auswahl hat auf dem Screenshot :)

PS: Dennoch ist mir dein else-Zweig schleierhaft. "in" geht da ja garnicht mit ein :gruebel:

Muetze1 28. Mai 2008 01:18

Re: Rechenproblem
 
Zitat:

Zitat von Medium
PS: Dennoch ist mir dein else-Zweig schleierhaft. "in" geht da ja garnicht mit ein :gruebel:

Wozu auch? Nach seiner Tabelle kann man es als 128 - 255 sehen bei maske zwischen 128-255. Mehr macht meine Routine nicht, man kann im Else Zweig sogar direkt Maske zurück geben um auf's Gleiche zu kommen. Du willst bestimmt auf sowas hinaus:

Delphi-Quellcode:
if maske <= 128 then
  out := round(in * (maske/128))
else
  out := 128 + round(in*((maske-128)/128));

Delphi-Fan-Friedrichsdorf 28. Mai 2008 12:18

Re: Rechenproblem
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von Muetze1
Wozu auch? Nach seiner Tabelle kann man es als 128 - 255 sehen bei maske zwischen 128-255. Mehr macht meine Routine nicht, man kann im Else Zweig sogar direkt Maske zurück geben um auf's Gleiche zu kommen. Du willst bestimmt auf sowas hinaus:

Der Text unter meiner Tabelle sagt es aber genauer, wenn die Tabelle unverständlich ist:

Zitat:

Zitat von Delphi-Fan-Friedrichsdorf
Es soll dort ein gleichmäßiger Farbverlauf zu Weiß (in Richtung MASK =255), bzw. zu Schwarz (in Richtung MASK =0) entstehen.

Beispiel (siehe Anhänge)

Benutzerfarbe: Rot

Maske: Farbverlauf von Schwartz nach Weiß

Ergebnis sollte dann sein:
Farbverlauf von Schwartz über Rot nach Weiß

DP-Maintenance 28. Mai 2008 12:26

DP-Maintenance
 
Dieses Thema wurde von "Luckie" von "Sonstige Fragen zu Delphi" nach "Multimedia" verschoben.
Gehört wohl nach Multimedia.

Medium 28. Mai 2008 16:18

Re: Rechenproblem
 
Schaue er nochmal auf Beitrag 3 ;)

Delphi-Fan-Friedrichsdorf 29. Mai 2008 12:30

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:
 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;
(muss für jeden RGB-Kanal einzeln gerechnet werden)

basierend auf der einfachen Formel für einen Farbverlauf(hier in RGB-Zerhackter Form):


Delphi-Quellcode:
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;
Auch wenn ich die Lösung doch noch selbst herausbekommen habe, danke ich euch für eure hilfe. :dp:

Die Muhkuh 29. Mai 2008 12:33

Re: Rechenproblem
 
Mach doch noch eine Funktion draus:

Delphi-Quellcode:
function CalcGradiendColor(start, end, pos, length: Integer): Integer;
begin
  Result := start + round ((end - start) * pos / length);
end;

// Aufruf:
RVal := CalcGradientColor(<Params>);
GVal := CalcGradientColor(<Params>);
BVal := CalcGradientColor(<Params>);

DeddyH 29. Mai 2008 12:33

Re: Rechenproblem
 
Aber dann bitte mit Rückgabewert :lol:

[edit] Owned :tongue: [/edit]

Die Muhkuh 29. Mai 2008 12:35

Re: Rechenproblem
 
Zitat:

Zitat von DeddyH
Aber dann bitte mit Rückgabewert :lol:

[edit] Owned :tongue: [/edit]

:stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 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