だるろぐ

明日できることは、今日しない。

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() って書いてあるのに!!(恥

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