C#のWinFormsで画像加工アプリ2「グレースケール化」

コンピュータ

グレースケール化を行うフィルター機能を追加します。

パッケージの追加

 cd GazouKakou01
dotnet add package OpenCVSharp4
dotnet add package OpenCVSharp4.Extensions
dotnet add package OpenCVSharp4.Windows

ソースコード

ファイル名:Form1.cs(前回の記事のソースコードに追加)

    // フィルター(Form1のメンバーとして追加)
    readonly ToolStripMenuItem filterMenuItem = new()
    {
        Text = "フィルター",
    };
    // グレースケール化
    readonly ToolStripMenuItem grayscaleMenuItem = new()
    {
        Text = "グレースケール",
    };
        // フィルター(Form1のコンストラクタに追加)
        menubar.Items.Add(filterMenuItem);
        // グレースケール
        filterMenuItem.DropDownItems.Add(grayscaleMenuItem);
        grayscaleMenuItem.Click += async (s, e) =>
        {
            if (_buffBmp is null) return;
            Bitmap? bmp = await GrayscaleDialog(_buffBmp);
            if (bmp is not null)
            {
                this.Bmp = bmp;
                mainPicbox.Image = this.Bmp;
            }
        };

ファイル名:Form1.Grayscale.cs(新規追加)

using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace GazouKakou01;
public partial class Form1 : Form
{
    public static async Task<Bitmap?> GrayscaleDialog(Bitmap src)
    {
        const string filterName = "グレースケール化";

        Form frm = new Form
        {
            FormBorderStyle = FormBorderStyle.FixedDialog,
            ClientSize = new System.Drawing.Size(640, 480),
            Text = filterName,
        };
        Label lbl = new Label
        {
            Size = new System.Drawing.Size(600, 60),
            Location = new System.Drawing.Point(10, 10),
            Text = filterName,
        };
        lbl.Parent = frm;
        PictureBox picbox = new()
        {
            Size = new System.Drawing.Size(600, 320),
            Location = new System.Drawing.Point(10, 70),
            Parent = frm,
        };
        Button okBtn = new Button
        {
            Size = new System.Drawing.Size(80,40),
            Location = new System.Drawing.Point(10, 410),
            Text = "OK",
            DialogResult = DialogResult.OK,
            Visible = false,
        };
        okBtn.Parent = frm;
        Button cancelBtn = new Button
        {
            Size = new System.Drawing.Size(80,40),
            Location = new System.Drawing.Point(100, 410),
            Text = "Cancel",
            DialogResult = DialogResult.Cancel,
            Visible = false,
        };
        cancelBtn.Parent = frm;

        frm.AcceptButton = okBtn;
        frm.CancelButton = cancelBtn;

        var dst = await Task.Run(()=>
        {
            // mat変換
            using var mat = BitmapConverter.ToMat(src);
            if (mat.Channels() >= 3)
            {
                // グレイスケール
                Cv2.CvtColor(mat, mat, ColorConversionCodes.RGB2GRAY);
            }
            // bmp変換
            return BitmapConverter.ToBitmap(mat);
        });
        picbox.Image = dst;
        okBtn.Visible = true;
        cancelBtn.Visible = true;

        if (frm.ShowDialog() == DialogResult.Cancel)
        {
            return null;
        }
        return dst;
    }
}

実行

画像が表示されている状態でメインメニュー「フィルター」→「グレースケール」

「OK」ボタンでフィルターが適用されます。

解説

カラーをグレスケールに変換する機能もありますが、個人的には24bit(RGB)や32bit(RGBA)を8bitに変換する目的で使っています。

コメント