C#
画像処理

任意の多角形の部分のみ表示する

業務の都合で、1枚の画像について必要な部分だけ取り出す必要があったのでメモ

main.cs
class MainClass
{
    public static void Main(string[] args)
    {
        Console.WriteLine("start!");

                //入力画像
        using (Bitmap img = new Bitmap("input.png"))
        {
            Graphics gi = Graphics.FromImage(img);

            //マスク用画像準備
            using (Bitmap mask = new Bitmap(img.Width, img.Height, PixelFormat.Format8bppIndexed))
            {
                //マスク画像の背景を白に設定
                ColorPalette palette = mask.Palette;
                palette.Entries[0] = Color.White;
                mask.Palette = palette;
                                 
                                //出力用画像
                using (Bitmap clone = new Bitmap(mask.Width, mask.Height, PixelFormat.Format24bppRgb))
                {
                    //チャンネル数の変換
                    Graphics go = Graphics.FromImage(clone);
                    go.DrawImage(mask, new Rectangle(0, 0, mask.Width, mask.Height));

                    //任意の点を指定
                    PointF p1 = new PointF(100, 100);
                    PointF p2 = new PointF(100, 300);
                    PointF p3 = new PointF(500, 300);
                    PointF p4 = new PointF(500, 200);
                    PointF p5 = new PointF(300, 200);
                    PointF p6 = new PointF(300, 100);
                    PointF[] points = { p1, p2, p3, p4, p5, p6 };

                    //指定範囲を黒く塗りつぶしマスク画像の作成
                    go.FillPolygon(Brushes.Black, points);

                    //マスクした場所のみ入力画像を表示させる
                    clone.MakeTransparent(Color.Black);
                    gi.DrawImage(clone, 0, 0, clone.Width, clone.Height);

                    //画像を保存する
                    img.Save("output.jpg");
                }
            }
        }
        Console.WriteLine("end!");
    }
}

バッチ的な書き方で読みにくくなってる。
あとは、指定領域をRectangleで指定して切り出したら終了かな。

参考にさせて頂いたサイト
c#でBITMAP画像マスク
Bitmap クラスのパレットに任意の色を設定するには
Graphics.FillPolygon メソッド (Brush, PointF[], FillMode)