Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Blending Mode (Softlight) in R5G6B5



Corti
20.03.2013, 10:32
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/articles/blendmodes/softlight.htm
http://www.pegtop.net/delphi/articles/blendmodes/hardlight.htm

Mein Ergebnis: ( Edit: Bild nicht mehr aktuell, Bug gefixt. )
17194

Die Formeln hab ich von hier:
http://stackoverflow.com/questions/5919663/how-does-photoshop-blend-two-images-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).



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:
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.