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