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.FromArgb Method (System.Drawing) | Microsoft Docs

color_code が RRGGBB だったので、それをそのまま int にパースして渡すと、アルファ値が“00”、つまり透明になる。直し方はいろいろあるだろうけど、今回は適当に以下のように修正。

color = Color.FromArgb(
int.Parse(
"ff" + color_code.ToLower(),
System.Globalization.NumberStyles.HexNumber
)
);

ちゃんと Color.FromArgb() って書いてあるのに!!(恥

そうやって、苦しみながらコレ(プロ生ちゃんアイコンジェネレーター - だるろぐ)を作りました。