RGSS2を知る(12)
グレースケール化の処理について。
osakana.factoryさま
http://ofo.jp/osakana/cgtips/grayscale.phtml
このサイトさまを参考に、Spriteのグレースケール化した色と、自前計算した色が一致するような計算式を探った。
b = Bitmap.new(200,200) b.fill_rect(b.rect, Color.new(255,255,100)) s = Sprite.new s.bitmap = b v = Viewport.new(200,0,200,200) v.color = Color.new(255,255,100) g = 0 loop do g += 1 g = 255 if g > 255 s.tone.gray = g vr = 255 + (((255*0.298912+255*0.586611 +100*0.114478 )-255) * g / 255) vg = 255 + (((255*0.298912+255*0.586611 +100*0.114478 )-255) * g / 255) vb = 100 + (((255*0.298912+255*0.586611 +100*0.114478 )-100) * g / 255) v.color = Color.new(vr, vg, vb) Graphics.update end
なんというか無理矢理なコードだが、上記サイトさまによるとNTSC係数による加重平均法という式を突っ込むとRGSSの処理と完全に一致するように見える。
Y = ( 0.298912 * R + 0.586611 * G + 0.114478 * B )
簡略化した計算にすると微妙に色がズレるから、たぶんこの式で合っているはず。
ところでSpriteのtone、colorは初期値がnilだとばっかり思っていたが、それぞれ(0,0,0,0)のToneオブジェクトとColorオブジェクトが入っていた。