Delphi: Farben addieren / subtrahieren
lima-city → Forum → Programmiersprachen → Delphi & Pascal
addition
ahnung
beitrag
einzelnen komponenten
ergebnis
farbe
formel
grundfarbe
intervall
kreisen
mache
maximalwert
mischung
pixel
result
rot anteil
schieberegler
subtraktion
summen
window
-
Hallo, hat jemand eine Ahnung, wie man Farben addiert / subtrahiert?
Ich habe in der Schule einen Farbkreis programmiert, d.h. besser gesagt, drei Kreise, die sich ?berschneiden und dann immer ihre Farbwerte addieren.
Ich wei?, dass die Farben so aufgebaut sind:
rotwert * gr?nwert^2 * blauwert^3
Jetzt wei? ich aber nicht, wie ich 2 Farben addiere, denn die einzelnen Werte d?rfen ja nur maximal 255 einnehmen und wenn ich eine Farbe mit bspw. rotwert1=200 und rotwert2=240 habe, w?rde die Summe ja rotwert=440 ergeben, einen Solchen Wert darf rotwert aber nicht einnehmen. einfach zu sagen
IF (rotwert > 255) THEN rotwert := 255;
gef?llt mir nicht richtig, das w?re doch ein verf?lschtes Ergebnis, oder?
Genau so mit der Subtraktion, ich habe keine Ahnung, wie ich das realisieren soll. Momentan habe ich einfach die Farbzuweisungen vertauscht, so dass cyan, magenta und gelb au?en sind und die urspr?nglichen rot, gr?n und blau als Additionsfarben angezeigt werden. Die Mitte jedoch, wei?, musste ich per Hand eintragen ;O)
Das will ich aber alles Gecodet haben. Hat jemand eine Ahnung, wie ich das anstelle? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich kenn mich mit so was nicht wirklich aus, aber ich w?rde einfach mal folgendes probieren, und das Ergebnis ?berpr?fen:
Du hast drei Farben F1, F2 und F3 mit den jeweiligen Rot-, Gr?n- und Blau-Anteilen. Wenn du die addieren willst, dann mach das einfach! Addiere die Farbanteile, und drittle diese einfach! Ich wei? nur nicht, ob das Ergebnis stimmt!
Rot-Anteil neu = (R1+R2+R3)/3
f?r G und B das selbe!
Schreib mal, ob's so vielleicht geht! W?rde mich interessieren, aber so w?rde ich das versuchen! -
Du brauchst mir die Formeln nicht zu geben, wenn es nur ne poplige Verktoraddition ist.
Die Seite gibt nur die 'allgemeinen' Hinweise zum RGB-Modell. alles, was mir ohnehin schon klar ist.
Die Vektoraddition sowie die Multiplikation mit Skalaren k?nnen auf RGB-Tripel sinnvoll angewendet werden, wenn die Ergebnisse innerhalb des W?rfels liegen (also die einzelnen Komponenten nicht das Intervall [0,1] verlassen).
Toll ;O)
Das ist doch genau mein Problem, hinter das ich nicht komme. Soll ich jetzt einfach den Restwert abschneiden, d.h. den Wert bei ?berschreitung auf 255 zur?cksetzen?
Ich habe mein Programm leider noch in der Schule, aber ich kann mal schauen, ob ich Bock habe, das noch mal zu programmieren, damit Ihr seht, was ich meine.
Das Mit den Grundfarben addieren ist schon klar. Ich habe nicht alle Farben per Hand rein geschrieben. Bei der Addition geht das noch nach der Formel
rotwert * gr?nwert^2 * blauwert^3
wenn man nur die Grundfarben verwendet.
Subtraktion hab ich jedoch nicht hinbekommen und Mischwertaddition auch nicht. Ich les mir mal die Seite durch und schreib dann wieder hier rein, wenn ich was entscheidendes finde.
Beitrag ge?ndert am 4.05.2006 09:57 von ku-shi
Beitrag ge?ndert am 4.05.2006 19:03 von ttobsen -
Hoffe dich jetzt nicht falsch zu verstehen:
Den RGB w?rfel kann man ja vektoriell darstellen,
ersteinmal welchen Farbbefehl benutzt du bei Delphi?
nimm am besten den RGB(R,G,B) Befehl (Integer) ..
Speicher alle farbwerte in variablen und schreibe eine function die round((r1+r2)/2) etc. ausgiebt
und sie dann auf
XXX.color:=RGB(R-neu,G-neu,B-neu) ausgiebt, zum beispiel ein Panel/Label/Button oder was immer du willst.
habe es mal mit rot (255,0,0) und blau(0,0,255) ausprobiert .. kommt also dunkel violett (128,0,128) raus.
(m?sste schonmal die addition sein, oder) -
Sorry f?r den Doppelpost.
FF0000 + 0000FF = FF00FF
16711680 + 255 = 16711935
Ihr k?nnt das ruhig nachrechnen.
Das wird so gerechnet:
--------->
FF FF FF (wei?)
von rechts angefangen: (F=15)
^ F*16^0 = 15
| F*16^1 = 240
| F*16^2 = 3840
| F*16^3 = 61440
| F*16^4 = 983040
| F*16^5 = 15728640
alles addiert ergibt: 16777215 = FFFFFF = wei?
15+240 = 255 = 0000FF = blau
3840+61440 = 65280 = 00FF00 = gr?n
983040+15728640 = 16711680 = FF0000 = rot
Hmm, ich ?berlege noch mal nach:
blau = blau ;O)
gr?n = gr?n+255*gr?n
rot = rot+2*255*rot+255^2*rot
Ich wei? nicht, ob mich das weiter bringt. Ich ?berlege morgen weiter. Jetzt ist mir zu sp?t! -
mit GetRValue, GetBValue, GetGValue die Farbkomponenten holen
dann rechnen + -
dann mit Glaube ... ach hier ein bissel code...
{ Windows- oder Delphifarbformat zu eigenen RGB-Typ umwandeln}
function RGB(color: TColor): T_RGB; overload;
begin
// !!! Windowsfarbformat !!!
Result.R := GetRValue(ColorToRGB(color));
Result.G := GetGValue(ColorToRGB(color));
Result.B := GetBValue(ColorToRGB(color));
end;
{ Und auch wieder R?ckg?ngig}
function Color(rgb: T_RGB): TColor; overload;
begin
Result := Windows.RGB(rgb.R, rgb.G, rgb.B);
end;
{ Erstellt einen RGB-Typ aus den einzelnen Komponenten }
function RGB(r, g, b: Byte): T_RGB; overload;
begin
Result.R := r;
Result.G := g;
Result.B := b;
end;
destructor TFastRGB.Destroy;
begin
SetLength(myPixels, 0);
inherited Destroy;
end;
-----------------------
Musst aber pr?fen ob der wert nicht ausserhalb der intervalle liegt... also zwischen 0 und 255
bei fragen bitte per pn an mich, ich hab hier auch nochn bissel quellcode von mir ;) -
Okay, damit kann ich noch nicht wirklcih viel anfangen. Kannst Du mir das mal bitte genau erkl?ren. Was davon sind selbst definierte Variablen und was Eigenschaften von Objekten?
Was mache ich, wenn der Wert au?erhalb von [0, 255] liegt? So wie ich das hier verstehe, bekomme ich nur einfache Zahlenwerte f?r die Farben.
Das ist nicht mein Problem. Ich erkl?re Euch das mal genau:
Ich habe 3 Schieberegler f?r die Grundfarben, Jeweils einen pro Kreis. Diese gehen von 0 zu 255. Dann habe ich 3 feste Punkte definert, die als Mittelpunkte f?r die Kreise dienen. Dann lasse ich Pixel f?r Pixel pr?fen, ob er sich innerhalb eines Kreises befindet oder sogar innerhalb mehrerer. Das mache ich mit Pythagoras. Da ich immer nur die Intensit?t der Grundfarben mit den Schiebereglern bestimme, gibt es keine Probleme bei der Addition, da ich einfach nur eben diese Werte als Blau-, Gr?n- oder Rotwerte eingebe.
Ich habe mir das jetzt so vorgestellt, dass ich f?r jeden Kreis 3 Schieberegler erstelle und sich das Bild dann genau so aufbaut, wie oben beschrieben.
Ich habe also die Grundwerte der Farben der einzelnen Kreise. Ich k?nnte die ohne Probleme mit der von mir im obigen Post beschriebenen Formel addieren, nur habe ich ein Problem, wenn das Ergebnis den Maximalwert (16777215) ?berschreitet. Was mache ich dann?
Einfach runtersetzen finde ich nicht richtig, aber ist wohl die einzige L?sung, nehme ich an.
Beitrag ge?ndert am 5.05.2006 09:24 von ku-shi -
Ich glaube das Problem ist das du die nicht so einfach addieren kannst! Wenn ich richtig verstanden habe geht es um eine Mischung der Farben, oder?
nach deiner Annahme k?nntest du ja spa?eshalber rot und rot mischen und m?sstest ja wieder rot bekommen.
aber wenn du dann FF0000+FF0000 rechnest bek?mest du einen wert der h?her als 16777215 l?ge, also w?re die Mischfarbe wei? oder wie muss ich deine "Mischung" verstehen.
Kann sein dass ich deinen Aufbau nicht verstanden habe, aber durch einfache Addition kommst du ja nach ausreichend gro?er wiederholung der addition immer irgenwann zu wei?, gibt das Sinn? -
Ich habe jetzt folgende Formel:
'blau' steht f?r den gew?hlten Blauwert
'gr?n' steht f?r den gew?hlten Gr?nwert
'rot' steht f?r den gew?hlten Rotwert
blau + gr?n + rot + 255(gr?n + 257*rot)
mit dieser Formel kommt man auf den genauen Dezimalwert der Hexadezimalwerte im Format, in dem die Farben angegeben werden
Bsp. helles Grau - CCCCCC:
blau = 204
gr?n = 204
rot = 204
204 + 204 + 204 + 255(204 + 257*204) = 13421772
Diesen Wert k?nnte ich in Delphi angeben und es w?rde die richtige Farbe erscheinen. Ich kann die Farben einfach addieren, solange die einzelnen Werte nicht 255 ?berschreiten.
wenn ich jetzt bspw. die Farben 33CC99 und 442255 nehme, w?rde die Summe 77EEEE sein. Diese Farbe ist noch anzeigbar. 33CC99 und 442277 geht nicht mehr, da der Blauwert 255 ?bersteigen w?rde.
Mein Problem ist, wie ich in einem solchen Fall verfahren soll. Einfach den Blauwert auf 255 (FF) setzen oder gibt es daf?r eine Formel, die immer funktioniert, weil der Wert, der bei einer Addition heraus kommt, auf jeden Fall richtig ist, solange er den Wert 255 nicht ?berschreitet.
M?glich w?re auch eine Rechnung mit Zahlenwerten, d.h. wie im obigen Beispiel CCCCCC = 13421772.
Ich addiere also die Zahlen normal und rechne den Dezimalwert mit obiger Formel aus. Dann muss ich nur aufpassen, dass die Dezimalzahl den Maximalwert von 16777215 nicht ?berschreitet. Dann w?rde aber bspw. bei einer Addition von 0000CC und 0000EE 0001BA herauskommen, d.h. ich addiere zwei Blaut?ne und erhalte eine Mischung aus blau und gr?n, wovon ich mir nicht vorstellen kann, dass das stimmt.
Ich tappe da v?llig im Dunkeln!
Beitrag ge?ndert am 5.05.2006 23:19 von ku-shi -
habe auch mal die suchmaschienen befragt und das gefunden:
Wenn es vorkommt, dass die Vektorsumme ein Ergebnis ausserhalb des Farbw?rfels erzeugt (d.h. ein RGB-Teil ist gr?sser als 255), wird der Wert auf die Oberfl?che des W?rfels zurechtgestutzt. Die Gleichung, die den Addition-Modus darstellt ist
Quelle:
http://www.lernnetz-sh.de/kmLinux/doc/Grokking-the-GIMP-v1.0/node55.html
scheinst recht zu haben, dann gibt rot und rot ja auch wieder rot, da die einzel komponenten ja addiert werden und so keine blau/gr?n t?ne reinkommen.
Ist dein Problem damit gel?st, oder gibt es noch immer unklarheiten? -
Ja, ich denke das tuts jetzt.
Ist schon irgend wie logisch, aber ich war skeptisch, dass das so einfach ist.
Naja, trotzdem vielen Dank an euch alle. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage