WPF 中实现截图(含保存效果)

这篇具有很好参考价值的文章主要介绍了WPF 中实现截图(含保存效果)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现效果如当程序运行就实现截图,截图后也在内存流当中进行保留

步骤1 创建窗体注册鼠标点击和鼠标悬浮的事件鼠标点击时获取开始鼠标坐标位置

具体详细步骤看代码中的注释文章来源地址https://www.toymoban.com/news/detail-656417.html

<Window
    x:Class="jietu.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    AllowsTransparency="True"
    Background="Black"
    MouseDown="Window_MouseDown"
    MouseMove="Window_MouseMove"
    Opacity="0.1"
    WindowState="Maximized"
    WindowStyle="None"
    mc:Ignorable="d">
    <Grid>
        <!--  设置容器位置才能显示区域  -->
        <Canvas x:Name="cav" />
        <!--  cav 上添加容器  -->
    </Grid>
</Window>
using System.Drawing;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using static System.Math;//引用static Math 静态类减少多余代码
using static System.Convert;
using Rectangle = System.Windows.Shapes.Rectangle;
using Size = System.Drawing.Size;
using Microsoft.Win32;
using System.Drawing.Imaging;
using System.IO;
using System;
namespace jietu
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        double x;
        double y;
        bool ismousedown;
        private void Window_MouseDown(object sender, MouseButtonEventArgs e)
        {
          x=    e.GetPosition(null).X;
            y = e.GetPosition(null).Y;
            ismousedown = true;
        }

        private void Window_MouseMove(object sender, MouseEventArgs e)
        {
            if (ismousedown)
            {
               double dqx= e.GetPosition(null).X;
                double dqy = e.GetPosition(null).Y;

                //获取矩形的宽度 通过开始的坐标和现在的坐标计算出高和宽
              double width= Abs( dqx - x);//可能时负数所有取却对值
                double height = Abs( dqy - y);
                //绘制矩形
                Rectangle rectangle = new Rectangle();
                rectangle.Fill = new SolidColorBrush(Colors.White);
                rectangle.Stroke = new SolidColorBrush(Colors.White);
                rectangle.Width = width;
                rectangle.Height = height;
                if (x > dqx)
                {
                    Canvas.SetLeft(rectangle,dqx);
                    Canvas.SetTop(rectangle, y);
                }else
                {
                    Canvas.SetLeft(rectangle, x);
                    Canvas.SetTop(rectangle, y);
                }

                //将画好的图 添加到canvas 中
                //添加之前将上一次的添加删除
                cav.Children.Clear();
                cav.Children.Add(rectangle);

                if (e.LeftButton == MouseButtonState.Released)//鼠标抬起
                {
                    //将区域的位置 用gdi+ 绘图处理
                    if (e.GetPosition(null).X > x)
                    {
                        Bitmap bitmap = new Bitmap(ToInt32(width), ToInt32(height));//赋值宽 和高

                        using (Graphics op = Graphics.FromImage(bitmap))
                        {
                            op.CopyFromScreen(ToInt32(x), ToInt32(y), 0, 0, new Size(ToInt32(width), ToInt32(height)));

                            SaveFileDialog saveFileDialog = new SaveFileDialog();
                            saveFileDialog.Filter = "Png Files|*.png";
                            if (saveFileDialog.ShowDialog() == true)
                            {
                                bitmap.Save(saveFileDialog.FileName, ImageFormat.Png);
                            }
                        }
                           
                    }
                    else if (e.GetPosition(null).X!=x)
                    {
                        Bitmap bitmap = new Bitmap(Convert.ToInt32(width), Convert.ToInt32(height));
                        using (Graphics graphics = Graphics.FromImage(bitmap))
                        {
                            graphics.CopyFromScreen(Convert.ToInt32(Math.Abs(e.GetPosition(null).X)), Convert.ToInt32(y), 0, 0, new Size(Convert.ToInt32(width), Convert.ToInt32(height)));
                            MemoryStream memoryStream = new MemoryStream();
                            #region 转换为 image控件的 source,  BitmapImage 是 ImageSource的子类  MemoryStream 是内存流
                            //MemoryStream memoryStream = new MemoryStream();
                            //bitmap.Save(memoryStream, ImageFormat.Png);//保存到内存流中
                            //BitmapImage bitmapImage = new BitmapImage();
                            //bitmapImage.BeginInit();
                            //bitmapImage.StreamSource = memoryStream;
                            //bitmapImage.EndInit();

                            //bitmapImage  是储存的image 图像文件

                            #endregion
                            SaveFileDialog saveFileDialog = new SaveFileDialog();
                            saveFileDialog.Filter = "Png Files|*.png";
                            if (saveFileDialog.ShowDialog() == true)
                            {
                                bitmap.Save(saveFileDialog.FileName, ImageFormat.Png);
                            }
                        }
                    }
                    this.Close();
                }
            }
        }
    }
}

到了这里,关于WPF 中实现截图(含保存效果)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • WPF实现跳动的字符效果

    WPF实现跳动的字符效果

    本文将介绍一个好玩但实际作用可能不太大的动画效果:跳动的字符。为了提高动画效果的可重用性以及调用的灵活性,通过Behavior实现跳动的字符动画。先看下效果: 通过 TextEffect 的 PositionStart 和 PositionCount 属性控制应用动画效果的子字符串的起始位置以及长度,同时使用

    2024年02月13日
    浏览(6)
  • WPF中的效果Effect

    WPF中的效果Effect

    WPF提供了可应用于任何元素的可视化效果。效果的目标是提供一种简便的声明式方法,从而改进文本、图像、按钮以及其他控件的外观。不是编写自己的绘图代码,而是使用某个继承自Effect的类,以立即获得诸如模糊、光辉以及阴影等效果。 名称 说明 属性 BlurEffect 模糊元素

    2024年02月11日
    浏览(8)
  • WPF网格拖动自动布局效果

    WPF网格拖动自动布局效果

    使用Canvas和鼠标相关事件实现如下的效果: XAML代码: C#代码 项目地址github

    2024年02月11日
    浏览(11)
  • Microsoft Azure和WPF实现人脸检测

    Microsoft Azure和WPF实现人脸检测

    在本文中,详解如何使用Microsoft Azure和WPF技术的帮助下使用实现人脸API应用程序。该应用程序检测人脸图像,显示每张脸周围的红框,以及通过将光标移动到框来显示每张脸的描述的状态栏。 先决条件 在 Azure 门户中创建人脸 API。 在 WPF 应用程序中访问和管理人脸 API 密钥。

    2024年02月09日
    浏览(8)
  • WPF之Microsoft.Toolkit.Mvvm(一)

    WPF之Microsoft.Toolkit.Mvvm(一)

    WPF编程中使用MVVM框架开发步骤。 第一步: 安装package从nuget: Microsoft.Toolkit.MVVM 和Microsoft.Xaml.Behaviors.Wpf和PropertyChanged.Fody 入下图所示: 第二步:引用命名空间、新建View文件夹、ViewModel文件夹 在Model和ViewModel中引入命名空间如下图所示:                         

    2024年02月04日
    浏览(12)
  • Microsoft.Xaml.Behaviors.Wpf 的使用

    System.Windows.Interactivity.WPF这个已经过时,可以使用 Microsoft.Xaml.Behaviors.Wpf ,基本使用查不多,

    2024年02月13日
    浏览(15)
  • 在WPF窗口中增加水印效果

    在WPF窗口中增加水印效果

    ** ** 以Canvas作为水印显示载体,在Canvas中创建若干个TextBlock控件用来显示水印文案,如下图所示 然后以每一个TextBlock的左上角为中心旋转-30°,最终效果会是如图红线所示: 为了达到第一行旋转后刚好与窗口上边沿齐平,需要计算第一行其实位置的Top坐标,由于旋转角度为

    2024年02月04日
    浏览(13)
  • WPF使用Microsoft.Toolkit.Mvvm框架记录

    WPF使用Microsoft.Toolkit.Mvvm框架记录

    前言 为了解决WPF UI与程序逻辑之间得到解耦,所以使用Microsoft.Toolkit.Mvvm框架来实现,说真的开发逻辑真的有些不适应,不过理解就好。框架大体支持ICommand、IMessenger等。 MVVM是Model-View-ViewModel的简写。它本质上就是MVC (Model-View- Controller)的改进版。即模型-视图-视图模型。分

    2024年02月13日
    浏览(9)
  • WPF 自定义控件完成库容表盘显示效果

    WPF 自定义控件完成库容表盘显示效果

    先看一下显示效果:        需要注意的地方有以下几点: 表盘的刻度分部,长刻度和短刻度显示。 在数值80W时,需要更改刻度盘的颜色渐变。 在数值80W时,更改库容总数背景的显示,也是颜色渐变。刻度盘控件属性定义: 刻度盘的定义: 设置刻度盘的style: 库容总数背

    2024年02月16日
    浏览(11)
  • WPF自定义控件之ItemsControl鱼眼效果

    WPF自定义控件之ItemsControl鱼眼效果

    原理 先获取鼠标在控件中的坐标,在获取其每一项相对于ItemsControl的坐标,然后计算每一项离当前鼠标的距离,在根据这个距离,对其每一项进行适当的缩放 实现 创建一个类,命名为FishEyeItemsControl   public class FishEyeItemsControl : ItemsControl   添加应用鱼眼效果方法(控制其控

    2024年02月04日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包