Komisches Problem mit COLORREF und GetGValue,GetRValue,GetBValue



  • Hallo alle zusammen,

    in meinem aktuellen Programm wird in einer Methode ein Farbwert errechnet und als

    COLORREF color = ......;
    

    gespeichert und dann mittels

    return color;
    

    zurückgegeben;

    Wenn ich nun den sourcecode ändere in :

    int red=GetRValue(color);
    int green=GetGValue(color);
    int blue=GetBValue(color);
    if (DEBUG){
    	CString ausgabe;
    	ausgabe.Format("%i%s%i%s%i%s%i%s%i",itranfer," / ",jtranfer,"    R " ,red," G ",green," B ",blue);
    	MessageBox(NULL, ausgabe, "DEBUG: calcColor", MB_OK|MB_ICONERROR);
    }
    return color;
    

    wird ein vollkommen anderer Farbwert zurückgegeben als normal. (z.B: ein helles Lila statt schwarz) Der Unterschied bezieht sich nicht nur auf das aussehen der Farbe sondern sie RGBwerte sind tatsächlich unterschiedlich.
    Wenn ich den Debugcode(zeile 1-8) erst in der übergeordneten Funktion auf den rückgabewert anwende, werden die korrekten RGBwerte ausgegeben.

    Hat einer ne Ahnung an was das liegen könnte ? ich greife doch nur lesend auf die Farbe zu da dürfte sich doch nichts ändern oder?

    S.



  • Ist der Rückgabewert auch aus

    COLORREF color = RGB([rot], [grün], [blau]);
    

    erzeugt?

    Gruss, Gio



  • der rückgabewert wird auf zwei verschiedene, durch ein Flag unterschiedene, Arten erzeugt:

    entweder als:

    color = RGB(H * 2.55, H * 2.55, H * 2.55);
    

    oder als :

    color=HSL_to_RGB(H / 100.0, S / 100.0, V / 100.0);
    

    S.



  • Oh, dann versuch doch mal die einzelnen Werte nach int zu casten. RGB() ist nur ein Makro das sollte mit double geanu die Schwierigkeiten machen die Du beschreibst



  • ok ich habe es mal wie folgt gecastet:
    (Bei HSL_to_RGB hab ich es nicht gemacht, weil das eine von meinem Vorgänger geschriebene Funktion ist, die explizit Double werte erwartet.)

    if(flag){
      color = RGB((int)H * 2.55, (int)H * 2.55,(int)H * 2.55);
    }
    else{
      color = HSL_to_RGB(H / 100.0, S / 100.0, V / 100.0);
    }
    

    War das so gemeint?

    der Cast hat das problem wegen dem ich die Ausgabe überhaupt eingefügt habe, abgeschwächt. Was mich ein bisschen wundert weil das programm eigentlich nicht über den "RGB"-Ast läuft sondern über den "HSL_to_RGB"-Ast 😕

    Zum testen der Ausgabe hatte ich noch keine Zeit.

    Ich hatte nämlich das folgende problem:
    es soll eine vielzahl von Messwerten in Farben umgewandelt werden.
    Selbst wenn ich S auf 0% und V auf 100% stelle wird einer der Werte hellgrün was eigentlich gar nicht sein dürfte, weil dann alles Graustufen sein müssten.
    Der einzige Unterschied ist der Messwert und sonst nix. Alle konstanten Werte ändern sich nicht gegenüber den korrekt verarbeiteten Daten. Division Durch NULL kommt auch nicht vor.

    kann das irgendeine speicherunverträglichkeit sein? weil mit der Ausgabe wird der Fehler auch anders. ob besser kann ich leider nicht sagen weil ich die original farbe nicht kenne. 🙄

    S.



  • Ok Danke An Alle.

    Ich hab den Fehler inzwischen gefunden.
    Es war ein Rundungsproblem in der selbstgeschriebenen HSL_to_RGB.

    Die Übergeb werte wurden vor der Übergabe skaliert sollten aber eigentlich erst nach der Übergabe ind er Funktion skaliert werden.

    Jetzt gehts.

    Falls jemand auch mal so eine Umwandlung machen will:http://www.flashbattle.de/forumv2/print.php?threadid=9611&page=1&sid=34910f19060dd9d3bb997e9ea828e3cc
    und dann nach HSL suchen. Die Funktion steht in einem der Code-Beispiele.
    Und haltet euch genau an den Code. Wenn ihr das "H/=255.0;" schon vor der Übergabe macht ,wird es euch so wie mir gehen.

    S.


Anmelden zum Antworten