kostenloser Webspace werbefrei: lima-city


Delphi: Farben addieren / subtrahieren

lima-cityForumProgrammiersprachenDelphi & Pascal

  1. Autor dieses Themas

    ku-shi

    ku-shi hat kostenlosen Webspace.

    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?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    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!
  4. Autor dieses Themas

    ku-shi

    ku-shi hat kostenlosen Webspace.

    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
  5. 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)
  6. Autor dieses Themas

    ku-shi

    ku-shi hat kostenlosen Webspace.

    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!
  7. 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 ;)
  8. Autor dieses Themas

    ku-shi

    ku-shi hat kostenlosen Webspace.

    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
  9. 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?
  10. Autor dieses Themas

    ku-shi

    ku-shi hat kostenlosen Webspace.

    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
  11. 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?
  12. Autor dieses Themas

    ku-shi

    ku-shi hat kostenlosen Webspace.

    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.
  13. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!