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成分になるような変換なので、色を変えるのは簡単でしょ?