Denkansatz für Farbumrechnung



  • Hi,

    ich habe ein kleines Problem zum Thema Farbumrechnung.

    Also zum Problem:

    Ich habe einen unsigned long (32 Bit groß) mit einem Farbwert enthalten, nichts besonderes doch diesen will ich nun auf unsigned short (16 bit) konvertieren!

    Man ahnt hier schon das Problem 😞 z.B. ist die Farbe gelb bei einem unsigned long an einer viel höheren Position als bei einem unsigned short 😞

    dieshalb meine frage, wie könnte ich sowas konvertieren:

    unsigned long color_dword = 0xFFFF80FF;
    
    unsigned short newcolor = convertFrom32BitTo16Bit (color_dword);
    

    Ich beiße da irgendwie auf granit 😞



  • Bei 32Bit haste normalerweise pro Farbkanal 8 Bit. Bei 16 Bit sinds entweder je 5Bit, oder halt 6Bit für grün und die anderen 5 Bit. Das einzige was Du jetzt tun mußt ist die einzelnen Werte der Farbkanäle extrahieren und von denen die unteren Bits wegschmeißen. Das ganz dann wieder zusammensetzen und fertig. 🙂

    MfG Jester



  • Danke, diese idee kam mir vor ca. 4 minuten auch 🙂 habs hinbekommen, auch wenn diese lösung meiner meinung nach sehr unelegant geworden ist 😞 4 casts sind enthalten und die werden nichtmal von meinem Compiler wegoptimiert im Releasemode (VC++6)



  • hm, wieso das?

    nehmen wir mal rot als 0x00FF0000, blau als 0x0000FF00 und grün halt als 0x000000FF

    Dann krieg ich das doch so(mit je 5 Bit):

    r = (oldcolor&rot)>>19 
    g = (olcolor&blau)>>11 
    b = (oldcolor&grün)>>3;
    
    newcolor = r<<10 | b<<5 | g;
    

    MfG jester



  • naja ich hab im ARGB format gespeichert und nicht im RBG Format und möchte auf dann auf das RGB Format 🙂

    Quellcode siehste ja im C++ Fprum den ich mir da zusammengeworfen habe 🙄



  • r = (oldcolor&rot)>>19
    g = (olcolor&grün)>>10
    b = (oldcolor&blau)>>3

    newcolor = r<<11 | g<<5 | b;

    try that


Anmelden zum Antworten