maxfie1d のブログ

マイクロソフト系技術ネタを中心に書きます。

C# コンソールアプリで矩形を描画して画像に保存する

タイトル通りです。

System.Drawing .NET Core などに含まれないので、 Windows のみの動作になります。

さっそくコード

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;

namespace ColorRectangles
{
    class Program
    {
        /// <summary>
        /// HexカラーコードからColor構造体に変換する
        /// </summary>
        static Color HexColorToColor(string hexcolor)
        {
            // 各チャンネルを取り出す
            string r = hexcolor.Substring(1, 2);
            string g = hexcolor.Substring(3, 2);
            string b = hexcolor.Substring(5, 2);

            return Color.FromArgb(Convert.ToByte(r, 16), Convert.ToByte(g, 16), Convert.ToByte(b, 16));
        }

        /// <summary>
        /// 矩形を描画する
        /// </summary>
        static void DrawRectangle(Graphics g, Color color, int length, int index)
        {
            using (var brush = new SolidBrush(color))
            {
                var rect = new Rectangle(length * index, 0, length, length);
                // 矩形(塗りつぶしあり)を描画
                g.FillRectangle(brush, rect);
            }
        }

        static void Main(string[] args)
        {
            var colors = new string[]
            {
                "#FFFFFF", "#E7E8EB", "#DE3A3B", "#D38D5E", "#FEF935", "#51C34F", "#2CAD68", "#2CB6B1", "#E12DA0", "#6543E9", "#8783BE", "#68878F", "#40414B", "#363748", "#292B35"
            }
            .Select((c, index) => new ValueTuple<int, Color>(index, HexColorToColor(c)));

            const int width = 100;

            using (Bitmap canvas = new Bitmap(width * colors.Count(), width))
            {
                using (Graphics g = Graphics.FromImage(canvas))
                {
                    foreach (var (index, color) in colors)
                    {
                        DrawRectangle(g, color, width, index);
                    }
                }
                // 画像として保存する
                canvas.Save("./rectangles.png", ImageFormat.Png);
            }
        }
    }
}

ポイントは

  • System.Drawingの使用
    • コンソールアプリではデフォルトで参照されていないので、ソリューションエクスプローラーから参照を追加しますf:id:maxfieldwalker:20180124141215p:plain
  • ValueTupleの使用
    • C# 7 から使えるタプルを使ってみました。nugetからSystem.ValueTupleをインストールします。f:id:maxfieldwalker:20180124141438p:plain
  • usingステートメントの使用

です。

実行結果

カラフルな正方形がたくさん描画されました。

f:id:maxfieldwalker:20180124141603p:plain