AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rechenproblem

Ein Thema von Delphi-Fan-Friedrichsdorf · begonnen am 27. Mai 2008 · letzter Beitrag vom 29. Mai 2008
Antwort Antwort
Seite 1 von 2  1 2      
Delphi-Fan-Friedrichsdorf

Registriert seit: 10. Mär 2007
Ort: Friedrichsdorf
24 Beiträge
 
Delphi 6 Enterprise
 
#1

Rechenproblem

  Alt 27. Mai 2008, 23:28
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.
Sebastian
"Alle großen Mathematiker haben ein "th" im Namen: Thales, Pythgoras,..."
Dr. M. BarTH, Mathelehrer
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Rechenproblem

  Alt 28. Mai 2008, 00:07
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
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Rechenproblem

  Alt 28. Mai 2008, 00:27
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 ^^)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Rechenproblem

  Alt 28. Mai 2008, 00:31
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)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Rechenproblem

  Alt 28. Mai 2008, 00:34
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
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Rechenproblem

  Alt 28. Mai 2008, 01:18
Zitat von Medium:
PS: Dennoch ist mir dein else-Zweig schleierhaft. "in" geht da ja garnicht mit ein
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));
  Mit Zitat antworten Zitat
Delphi-Fan-Friedrichsdorf

Registriert seit: 10. Mär 2007
Ort: Friedrichsdorf
24 Beiträge
 
Delphi 6 Enterprise
 
#7

Re: Rechenproblem

  Alt 28. Mai 2008, 12:18
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 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ß
Miniaturansicht angehängter Grafiken
ergebnis_137.png   maske_383.png  
Sebastian
"Alle großen Mathematiker haben ein "th" im Namen: Thales, Pythgoras,..."
Dr. M. BarTH, Mathelehrer
  Mit Zitat antworten Zitat
28. Mai 2008, 12:26
Dieses Thema wurde von "Luckie" von "Sonstige Fragen zu Delphi" nach "Multimedia" verschoben.
Gehört wohl nach Multimedia.
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Rechenproblem

  Alt 28. Mai 2008, 16:18
Schaue er nochmal auf Beitrag 3
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Delphi-Fan-Friedrichsdorf

Registriert seit: 10. Mär 2007
Ort: Friedrichsdorf
24 Beiträge
 
Delphi 6 Enterprise
 
#10

Re: Rechenproblem

  Alt 29. Mai 2008, 12:30
Mein Problem hat sich gelöst.
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.
Sebastian
"Alle großen Mathematiker haben ein "th" im Namen: Thales, Pythgoras,..."
Dr. M. BarTH, Mathelehrer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz