グレースケール化を行うフィルター機能を追加します。
パッケージの追加
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に変換する目的で使っています。
コメント