hex dezimal: abdunkeln?



  • wie kann einen farbwert um einen bestimmten wert abdunkeln?
    bei grau werten kann man ja einfach hex abziehen, bei farben wird dann aber die farbe verändert!



  • Farbe besteht aus RRGGBB (im hex code), dann kannst du die in drei teile zerlegen und von denen einzelnd deinen wert abziehen, das müsste funktionieren. beispiel gibs jetzt net, zu müde!



  • Multiplizieren mit Faktor < 1.

    Bye, TGGC



  • -Foo- schrieb:

    Farbe besteht aus RRGGBB (im hex code), dann kannst du die in drei teile zerlegen und von denen einzelnd deinen wert abziehen, das müsste funktionieren. beispiel gibs jetzt net, zu müde!

    ja das hab ich mir auch überlegt, aber wie zerteil ich das denn? 🙂



  • TGGC schrieb:

    Multiplizieren mit Faktor < 1.

    Bye, TGGC

    nope geht nicht verfälscht die farben aufs extremste (augenkrebs)



  • DWORD dwColor = RGB(128, 128, 128);

    unsigned char Red = (BYTE)(dwColor);
    unsigned char Green = (BYTE)(((WORD)(dwColor)) >> 8);
    unsigned char Blue = (BYTE)((dwColor)>>16);

    Red -= 10;
    Green -= 10;
    Blue -= 10;

    DWORD dwResult = RGB(Red, Green, Blue);

    mfc
    Nitrox



  • Hm, was auch möglich sein müsste:

    unsigned int color = 00xFF80FF;
    unsigned char darker = 0x10;
    unsigned int diff = darker | ((darker << 8 ) & 0xFF00) | ((darker << 16 ) & 0xFF0000);
    color -= diff;
    

    aber nur, wenn danach kein farbwert unter 0 gehen würde... aber sonns tmüsste das gehen?



  • Ihr könnt doch nicht einfach von jedem Wert einen konstanten Faktor abziehen! Damit verfälscht man doch die Farbe.

    Ein erster Schritt ist Zerlegung der Farbe in die 3 RGB-Werte und jeweils(!) Multiplikation mit einem Faktor < 1 (immer der gleiche Faktor), danach wieder einen RGB-Wert erzeugen.

    Allerdings müßte es dabei auch noch einen Fehler geben, da Grün vom Auge anders empfunden wird als Rot und Blau, für eine völlige korrekte Vorgehensweise müßte man die Farbe meines Wissens in einen Farbraum konvertieren, der speziell die Helligkeit aus der Farbe ermittelt, diese manipulieren, und die Farbe wieder zurückrechnen. YUV würde mir dazu einfallen. Ich denke aber, daß man das nur bei wirklich exakter Berechnung machen muß, für bewegte Bilder sollte die 1. Variante ausreichend sein.



  • So ist darker() in Java implementiert.

    public Color darker() {
    	return new Color(Math.max((int)(getRed()  *FACTOR), 0), 
    			 Math.max((int)(getGreen()*FACTOR), 0),
    			 Math.max((int)(getBlue() *FACTOR), 0));
    }
    

    und so brighter():

    public Color brighter() {
            int r = getRed();
            int g = getGreen();
            int b = getBlue();
    
            /* From 2D group:
             * 1. black.brighter() should return grey
             * 2. applying brighter to blue will always return blue, brighter
             * 3. non pure color (non zero rgb) will eventually return white
             */
            int i = (int)(1.0/(1.0-FACTOR));
            if ( r == 0 && g == 0 && b == 0) {
               return new Color(i, i, i);
            }
            if ( r > 0 && r < i ) r = i;
            if ( g > 0 && g < i ) g = i;
            if ( b > 0 && b < i ) b = i;
    
            return new Color(Math.min((int)(r/FACTOR), 255),
                             Math.min((int)(g/FACTOR), 255),
                             Math.min((int)(b/FACTOR), 255));
    }
    

    P.S: FACTOR wird mit 0.7 angegeben.



  • pixartist schrieb:

    TGGC schrieb:

    Multiplizieren mit Faktor < 1.

    Bye, TGGC

    nope geht nicht verfälscht die farben aufs extremste (augenkrebs)

    Dann machst du was falsch.



  • Alternative:
    RGB->HLS

    Dann kannst Saettigung und Helligkeit ganz bequem getrennt von Farbe bearbeiten.



  • Lieber YUV als HLS, da ist die Transformation etwas weniger rechenintensiv.



  • Und am Ende kommt doch wieder das gleiche wie bei Multiplikation raus... 😎

    Bye, TGGC



  • noch ne frage wegen hex:
    realAlpha
    -> wert zwischen 0 und 1, der den alphawert darstellen soll...
    Red/Green/Blue
    -> hintergrundfarben
    RedE/GreenE/BlueE
    -> Überlagernde Farben

    Red = ?
    Green =  ?
    Blue = ?
    

    wie kann ich daraus eine transparenz erstellen, sprich...die überlagernde farbe entsprechend des alpha wertes auf der hintergrundfarbe darstellen ( alpha 0 -> nurnoch hintergrund sichtbar)
    ? danke!



  • Hintergrundfarbe und Alphafarbe linear interpolieren mit dem Alphawert als Gewicht.

    Bye, TGGC



  • TGGC schrieb:

    Hintergrundfarbe und Alphafarbe linear interpolieren mit dem Alphawert als Gewicht.

    Bye, TGGC

    linear interpolieren = ?



  • pixartist schrieb:

    TGGC schrieb:

    Hintergrundfarbe und Alphafarbe linear interpolieren mit dem Alphawert als Gewicht.

    Bye, TGGC

    linear interpolieren = ?

    http://de.wikipedia.org/math/09ec403c6b567d82ef9242b0f5915185.png
    sagt mir jetzt nix, ich hab doch nur 2 werte...


  • Mod

    newRed = Red1+Factor*(Red2-Red1);
    

    rapso->greets();



  • rapso schrieb:

    newRed = Red1+Factor*(Red2-Red1);
    

    rapso->greets();

    sooo leicht und auch so logisch...
    hätt ich ma drauf kommen können
    danke


  • Mod

    bitte private provokationen und streitereien usw. per mail lösen, das hier ist der falsche forums-unterbereich dafür und damit das nicht ausartet lösch ich das.

    rapso->greets();


Anmelden zum Antworten