You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

226 lines
7.3 KiB
C#

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace ScreenShotOCR
{
/// <summary>
/// CaptureWindow.xaml에 대한 상호 작용 논리
/// </summary>
public partial class CaptureWindow : Window
{
public EventHandlerGrab m_handlerGrab = null;
Bitmap bitmap = null;
Bitmap crop = null;
Image bg = null;
int screen_w = (int)SystemParameters.PrimaryScreenWidth;
int screen_h = (int)SystemParameters.PrimaryScreenHeight;
System.Drawing.Rectangle roi = new System.Drawing.Rectangle();
float resX = 1.0f;
float resY = 1.0f;
bool bClicked = false;
System.Drawing.PointF pt = new System.Drawing.PointF();
public CaptureWindow()
{
InitializeComponent();
SetTransparent(true);
m_handlerGrab = delegate ()
{
var crop = bitmap.Clone(roi, bitmap.PixelFormat);
return crop;
};
}
public void SetTransparent(bool enable)
{
if (enable)
{
this.Background = System.Windows.Media.Brushes.Transparent;
ScreenView.Source = null;
}
else
{
this.Background = System.Windows.Media.Brushes.White;
}
}
private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
this.DragMove();
}
public void copyBtn_Click(object sender, RoutedEventArgs e)
{
try
{
//new Task(delegate
//{
SetTransparent(false);
if (bitmap != null) bitmap.Dispose();
if (bg != null) { bg.Dispose(); }
bitmap = new Bitmap(screen_w, screen_h, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
var gr = Graphics.FromImage(bitmap);
gr.CopyFromScreen(0, 0, 0, 0, bitmap.Size);
string name = "snapshot.png";
bg = ResizeImage(bitmap, new System.Drawing.Size(screen_w, screen_h));
ScreenView.Source = ConvertToImageSource(bg);
bitmap.Save(name, ImageFormat.Png);
gr.Dispose();
//}, TaskCreationOptions.DenyChildAttach).Start();
}
catch (Exception ex)
{
}
}
public static Bitmap ResizeImage(Bitmap imgToResize, System.Drawing.Size size)
{
try
{
Bitmap b = new Bitmap(size.Width, size.Height);
using (Graphics g = Graphics.FromImage((Image)b))
{
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.DrawImage(imgToResize, 0, 0, size.Width, size.Height);
}
return b;
}
catch
{
Console.WriteLine("Bitmap could not be resized");
return imgToResize;
}
}
private ImageSource ConvertToImageSource(Image image)
{
using (var ms = new MemoryStream())
{
image.Save(ms, ImageFormat.Bmp);
ms.Seek(0, SeekOrigin.Begin);
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.StreamSource = ms;
bitmapImage.EndInit();
return bitmapImage;
}
}
private void ClearBtn_Click(object sender, RoutedEventArgs e)
{
SetTransparent(true);
}
private void Close_Click(object sender, RoutedEventArgs e)
{
this.Visibility = Visibility.Hidden;
}
private void ScreenView_MouseDown(object sender, MouseButtonEventArgs e)
{
if (!bClicked)
{
bClicked = true;
var p = e.GetPosition(ScreenView);
float x = Convert.ToSingle(Math.Round(p.X * resX));
float y = Convert.ToSingle(Math.Round(p.Y * resY));
pt = new System.Drawing.PointF(x, y);
roi.X = Convert.ToInt32(x);
roi.Y = Convert.ToInt32(y);
}
}
private void ScreenView_MouseMove(object sender, MouseEventArgs e)
{
if (bClicked)
{
var p = e.GetPosition(ScreenView);
float x = Convert.ToSingle(p.X);
float y = Convert.ToSingle(p.Y);
var w = (float)Math.Round(x * resX - pt.X);
var h = (float)Math.Round(y * resY - pt.Y);
roi.Width = Convert.ToInt32(w);
roi.Height = Convert.ToInt32(h);
CheckROI();
DrawROI();
}
}
private void ScreenView_MouseUp(object sender, MouseButtonEventArgs e)
{
if (bClicked)
{
var p = e.GetPosition(ScreenView);
float x = Convert.ToSingle(p.X);
float y = Convert.ToSingle(p.Y);
var w = (float)Math.Round(x * resX - pt.X);
var h = (float)Math.Round(y * resY - pt.Y);
roi.Width = Convert.ToInt32(w);
roi.Height = Convert.ToInt32(h);
CheckROI();
DrawROI();
bClicked = false;
}
}
private void CheckROI()
{
int x = roi.X;
if (x < 0) { x = 0; } else if (x >= screen_w) { x = screen_w - 1; }
int y = roi.Y;
if (y < 0) { y = 0; } else if (y >= screen_h) { y = screen_h - 1; }
int w = roi.Width;
if (w < 0) { w = 0; } else if (x + w >= screen_w) { w = screen_w - 1 - x; }
int h = roi.Height;
if (h < 0) { h = 0; } else if (y + h >= screen_h) { h = screen_h - 1 - y; }
roi = new System.Drawing.Rectangle(x, y, w, h);
}
private void DrawROI()
{
if (bg == null) return;
try
{
int x = (int)Math.Round(Convert.ToSingle(roi.X / resX));
int y = (int)Math.Round(Convert.ToSingle(roi.Y / resY));
int w = (int)Math.Round(Convert.ToSingle(roi.Width / resX));
int h = (int)Math.Round(Convert.ToSingle(roi.Height / resY));
System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Red, 1);
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(x, y, w, h);
var tmp = (Bitmap)bg.Clone();
var gr = Graphics.FromImage(tmp);
gr.DrawRectangle(pen, rect);
ScreenView.Source = ConvertToImageSource(tmp);
//posX.Text = roi.X.ToString();
//posY.Text = roi.Y.ToString();
//posW.Text = roi.Width.ToString();
//posH.Text = roi.Height.ToString();
gr.Dispose();
tmp.Dispose();
}
catch
{
}
}
}
}