C#::画像の透明でないところを白く塗りつぶすよ!
デスクトップマスコットのようなもの「ブラウニーさん」、着実に開発が進んでおります。ゴミ箱の内容量256Mあたり1個のゴミオブジェクトを設置するようにしてみたら、ちょっと録画したファイル(4Gとか・・・)を消しただけで大変なことに。ゴミ屋敷すぎる。
今回のメモは、この中でも使っている「画像を白く塗りつぶして表示」するワザです。画像の中でダンボールに白い枠がついているものがあると思いますが、ここに使われています。
いきなりコードから。
void paint(System.Drawing.Graphics g){ var attribute = new System.Drawing.Imaging.ImageAttributes(); var cm = new System.Drawing.Imaging.ColorMatrix( new float[][]{ new float[]{ 0, 0, 0, 0, 0}, new float[]{ 0, 0, 0, 0, 0}, new float[]{ 0, 0, 0, 0, 0}, new float[]{ 0, 0, 0, 1, 0}, new float[]{255, 255, 255, 0, 0} }); attribute.SetColorMatrix(cm); g.DrawImage(image, new Rectangle(x,y,image.Width,image.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attribute); }
コレでオッケー。要は、色変換用の行列ColorMatrixを設定したImageAttributesをDrawImageの引数で渡すだけです。あとはどうやって色を変えればいいか、ですけど、これはもう行列の掛け算の話になって、色を表す行列(R,G,B,A,0)をここで定義される行列に掛けた結果が描画される色になる、という仕掛け。行列の掛け算の話はここでは省略。数学Cでも勉強してください。ん?数学Bだっけ?どっちだ?まぁいい。
これを利用することで、透明以外のところを白く残しながら、さらにちょっと拡大して描画し、その上に本来の画像を重ねることで、白く縁取りした画像にすることが出来ます。もちろん、行列を弄れば色を変えられます。この場合、行列5行目の255が左から順に透明でないところのR,G,B成分になるような変換なので、色を変えるのは簡単でしょ?