Graphics.FillRectangle() が正常に機能しない → 俺が間違ってました
執筆日時:
問題編
たったこれだけのコードが動かなくて、泣いた。
using (var fore = new Bitmap(icon_path)) using (var back = new Bitmap(fore.Width, fore.Height)) using (var brush = new SolidBrush (color)) using (var g = Graphics.FromImage(back)) { var src_rect = new RectangleF( 0, 0, back.Width, back.Height); var dst_rect = new RectangleF( x, y, back.Width * scale, back.Height * scale);g.FillRectangle(brush, src_rect); // <- 透明になる!! g.DrawImage(fore, dst_rect); }
ヒント
new SolidBrush (color) を Brushes.Red なんかにするとちゃんと動く(背景色が赤色になる)んだが……なにがおかしいんだ!
解決編
Color.FromArgb() の使い方が間違ってた(← 出題範囲外ですまん!!)。
color = Color.FromArgb(
int.Parse(
color_code.ToLower(),
System.Globalization.NumberStyles.HexNumber
)
);
32 ビットの ARGB 値のバイト順は AARRGGBB です。AA で表している最上位バイト (MSB) はアルファ コンポーネントの値です。RR、GG、BB で表している 2 番目、3 番目、4 番目のバイトは、それぞれ赤、緑、青のカラー コンポーネントです。
color_code が RRGGBB だったので、それをそのまま int にパースして渡すと、アルファ値が“00”、つまり透明になる。直し方はいろいろあるだろうけど、今回は適当に以下のように修正。
color = Color.FromArgb( int.Parse( "ff" + color_code.ToLower(), System.Globalization.NumberStyles.HexNumber ) );
ちゃんと Color.FromArgb() って書いてあるのに!!(恥
そうやって、苦しみながらコレ(プロ生ちゃんアイコンジェネレーター - だるろぐ)を作りました。