Ergebnis 1 bis 1 von 1

Thema: [C++] Blending Mode (Softlight) in R5G6B5

  1. #1

    [C++] Blending Mode (Softlight) in R5G6B5

    Guten Tag, 3 Augen sehen mehr als zwei. Vielleicht könnt ihr ja etwas sehen, dass ich in meinem baumlosen Wald nicht sehe.

    Ich versuche das photoshoppsche Softlight-Blending in einem DynRPg-Plugin für den RPG-Maker einzubauen. Das Ergebnis sieht eher aus wie Hardlight statt Softlight.
    http://www.pegtop.net/delphi/article.../softlight.htm
    http://www.pegtop.net/delphi/article.../hardlight.htm

    Mein Ergebnis: ( Edit: Bild nicht mehr aktuell, Bug gefixt. )
    Klicke auf die Grafik für eine größere Ansicht 

Name:	Bild2.jpg 
Hits:	25 
Größe:	76,4 KB 
ID:	17194

    Die Formeln hab ich von hier:
    http://stackoverflow.com/questions/5...mages-together

    Im Fall von Softlight:
    // ChannelBlend_SoftLight(A,B) ((uint8)((B < 128)?(2*((A>>1)+64))*((float)B/255):(255-(2*(255-((A>>1)+64))*(float)(255-B)/255))))

    Hierbei wird davon ausgegangen, dass jeder Kanal 8Bit Farbtiefe hat, der Wertebereich liegt daher bei 0 bis 255.
    Für den RPG Maker brauche ich R5G6B5-Format. D.h. rot und blau haben 5 bit, grün hat 6 Bit. Die maximalen Werte sind als 31 für rot und blau und 63 für grün.

    In der Originalformel sind die Werte 128 und 64 verwendet, also 255+1 / 2 oder auch 4~ ich verwendet als anstatt diesen Werten dann die Hälfte oder ein Viertel von 31+1(rb) bzw. 63+1(g).

    Code:
                            rPix = (src >> 11) ;
                            gPix = (src & 0x07E0) >> 5;
                            bPix = (src & 0x001F) ;
    
                            r = (unsigned char) ((    imgData->r[iPtr]  < 16     )    ?
                                                        (    (2* ((  imgData->r[iPtr]   >>1)           + 8 ))    *((float)    rPix    /31)         )     :
                                                        (      31-(2*(31-(( imgData->r[iPtr]   >>1)  +8 ))*(float)( 31 -      rPix    )/31 )   ) ) ;
    
                            g = (unsigned char) ((         imgData->g[iPtr]  < 32     )    ?
                                                        (    (2* ((  imgData->g[iPtr] >>1)+ 16 ))    *((float)  gPix /63)         )     :
                                                        (      63-(2*(63-(( imgData->g[iPtr] >>1)+16 ))*(float)( 63 - gPix )/63)   ) ) ;
    
                            b = (unsigned char) ((    imgData->b[iPtr] < 16     )    ?
                                                        (    (2* (( imgData->b[iPtr]  >>1)      + 8 )) *((float)   bPix/31)         )     :
                                                        (      31-(2*(31-(( imgData->b[iPtr]  >>1)+8 ))*(float)( 31 - bPix )/31 )   ) ) ;
    
                            r = std::min(31, (int)r);
                            g = std::min(63, (int)g);
                            b = std::min(31, (int)b);

    Nachtrag:
    Softlight ist ähnlich Overlay und Hardlight ist Overlay mit vertauschen Quelle/Ziel-Pixel. Wenn ich die Pixel der beiden Bildquellen vertausche kommt das hier aus:
    Klicke auf die Grafik für eine größere Ansicht 

Name:	Bild4.jpg 
Hits:	20 
Größe:	78,5 KB 
ID:	17195
    Sieht dem Softlight ähnlicher. (oh... Fehlerfixel )
    Gibt es Grafikprogramme, die Blending in R5G6B5 machen können, so dass ich einen Vergleich in gleichem Farbraum habe?

    Edit: Oh crap, 33 statt 31~, dadurch kamen die Fehlerpixel.

    Status:
    Es funktioniert, allerdings sieht es nicht ganz aus wie es das müsste. Ich weiss dabei nicht, ob es meine Fehlimplementierung ist oder aufgrund der viel gröberen Zahlenwerte passiert.

    Geändert von Corti (22.03.2013 um 14:44 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •