using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using OpenCvSharp;
using OpenCvSharp.WpfExtensions;
namespace ClipThreshold
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : System.Windows.Window
{
/********************************************************************
* フィルター・白黒化(2値化)
*********************************************************************/
private BitmapSource filter(BitmapSource inBitmap, int threshold = 32)
{
using var mat = BitmapSourceConverter.ToMat(inBitmap);
Cv2.CvtColor(mat, mat, ColorConversionCodes.BGRA2GRAY);
Cv2.Threshold(mat, mat, threshold, 255, ThresholdTypes.Binary);
Cv2.CvtColor(mat, mat, ColorConversionCodes.GRAY2BGRA);
var outBitmap = BitmapSourceConverter.ToBitmapSource(mat);
outBitmap.Freeze();
return outBitmap;
}
public MainWindow()
{
InitializeComponent();
var ms = (System.IO.MemoryStream)Clipboard.GetData("PNG");
if (ms is null)
{
System.Windows.Application.Current.Shutdown();
MessageBox.Show("クリップボードに画像が存在しない。");
return;
}
var bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.StreamSource = ms;
bi.EndInit();
bi.Freeze();
ViewImage.Source = filter(bi, (int)Slider1.Value);
Slider1.ValueChanged += async (s, e) =>
{
int t = (int)Slider1.Value;
var b = await Task.Run(() => filter(bi, t));
ViewImage.Source = b;
};
this.Closing += (s, e) =>
{
if (ViewImage.Source is null) { return; }
BitmapSource bi = (BitmapSource)ViewImage.Source;
var pngEnc = new PngBitmapEncoder();
pngEnc.Frames.Add(BitmapFrame.Create(bi));
using var mem = new System.IO.MemoryStream();
pngEnc.Save(mem);
Clipboard.SetData("PNG", mem);
};
}
}
}
コメント