实现效果如当程序运行就实现截图,截图后也在内存流当中进行保留
步骤1 创建窗体注册鼠标点击和鼠标悬浮的事件鼠标点击时获取开始鼠标坐标位置文章来源:https://www.toymoban.com/news/detail-656417.html
具体详细步骤看代码中的注释文章来源地址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模板网!