• C#屏幕截图


    今天通过C#来实现一个简单的屏幕截图功能。实现思路,获取鼠标按下去的位置和鼠标左键释放的位置,计算这个区域的宽度和高度。然后通过 Graphics.CopyFromScreen 方法便可以获取到屏幕截图了。

    下面通过C#+WPF来实现这个功能,代码如下:

    XAML:

    <Window x:Class="WPFCaptureScreenShot.CaptureWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="CaptureWindow" 
            AllowsTransparency="True"
            WindowStyle="None"
            Background="Black"
            Opacity="0.1"
            WindowState="Maximized"
            MouseDown="CaptureWindow_MouseDown"
            MouseMove="CaptureWindow_MouseMove">
        <Canvas x:Name="CaptureCanvas">
            
        </Canvas>
    </Window>
    
        public partial class CaptureWindow : Window
        {
            private double x;
            private double y;
            private double width;
            private double height;
    
            private bool isMouseDown = false;
    
            public CaptureWindow()
            {
                InitializeComponent();
            }
    
            private void CaptureWindow_MouseDown(object sender, MouseButtonEventArgs e)
            {
                isMouseDown = true;
                x = e.GetPosition(null).X;
                y = e.GetPosition(null).Y;
            }
    
            private void CaptureWindow_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
            {
                if(isMouseDown)
                {
                    // 1. 通过一个矩形来表示目前截图区域
                    System.Windows.Shapes.Rectangle rect = new System.Windows.Shapes.Rectangle();
                    double dx = e.GetPosition(null).X;
                    double dy = e.GetPosition(null).Y;
                    double rectWidth = Math.Abs(dx - x);
                    double rectHeight = Math.Abs(dy - y);
                    SolidColorBrush brush = new SolidColorBrush(Colors.White);
                    rect.Width = rectWidth;
                    rect.Height = rectHeight;
                    rect.Fill = brush;
                    rect.Stroke = brush;
                    rect.StrokeThickness = 1;
                    if (dx < x)
                    {
                        Canvas.SetLeft(rect, dx);
                        Canvas.SetTop(rect, dy);
                    }
                    else
                    {
                        Canvas.SetLeft(rect, x);
                        Canvas.SetTop(rect, y);
                    }
    
                    CaptureCanvas.Children.Clear();
                    CaptureCanvas.Children.Add(rect);
    
                    if(e.LeftButton == MouseButtonState.Released)
                    {
                        CaptureCanvas.Children.Clear();
                        // 2. 获得当前截图区域
                        width = Math.Abs(e.GetPosition(null).X - x);
                        height = Math.Abs(e.GetPosition(null).Y - y);
    
                        if(e.GetPosition(null).X > x)
                        {
                            CaptureScreen(x, y, width, height);
                        }
                        else
                        {
                            CaptureScreen(e.GetPosition(null).X, e.GetPosition(null).Y, width, height);
                        }
                        
    
                        isMouseDown = false;
                        x = 0.0;
                        y = 0.0;
                        this.Close();
                    }
                }
            }
    
            private void CaptureScreen(double x, double y, double width, double height)
            {
                int ix = Convert.ToInt32(x);
                int iy = Convert.ToInt32(y);
                int iw = Convert.ToInt32(width);
                int ih = Convert.ToInt32(height);
    
                System.Drawing.Bitmap bitmap = new Bitmap(iw, ih);
                using(System.Drawing.Graphics graphics = Graphics.FromImage(bitmap))
                {
                    graphics.CopyFromScreen(ix, iy, 0, 0, new System.Drawing.Size(iw, ih));
    
                    SaveFileDialog dialog = new SaveFileDialog();
                    dialog.Filter = "Png Files|*.png";
                    if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        bitmap.Save(dialog.FileName, ImageFormat.Png);
                    }
                }
            }

    运行效果:

    源代码可以点击这里下载。
    如果你有其他方式实现,欢迎与我分享。如果对代码有疑问,可以在评论中指出。感谢阅读。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    zap日志库
    Go Logger库基本使用
    golang中的MySQL增删改查
    golang链接mysql
    文件上傳
    參數綁定:
    gin獲取path參數
    gin獲取form提交的表單數據
    獲取query string
    返回json
  • 原文地址:https://www.cnblogs.com/yang-fei/p/4029782.html
Copyright © 2020-2023  润新知