gpt4 book ai didi

c# - WPF:截取屏幕截图的方法

转载 作者:太空狗 更新时间:2023-10-29 20:01:18 33 4
gpt4 key购买 nike

希望修改以下内容以截取所有监视器的屏幕截图。我试过调整它,但我的图像是空白的。写到 test.png 是为了测试。 byte[] 将被发送到接收应用。

public byte[] Take()
{
int screenWidth = Convert.ToInt32(SystemParameters.VirtualScreenWidth);
int screenHeight = Convert.ToInt32(SystemParameters.VirtualScreenHeight);
int screenLeft = Convert.ToInt32(SystemParameters.VirtualScreenLeft);
int screenTop = Convert.ToInt32(SystemParameters.VirtualScreenTop);

RenderTargetBitmap renderTarget = new RenderTargetBitmap(screenWidth, screenHeight, 96, 96, PixelFormats.Pbgra32);
VisualBrush sourceBrush = new VisualBrush();

DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();

using (drawingContext)
{
drawingContext.PushTransform(new ScaleTransform(1, 1));
drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(screenWidth, screenHeight)));
}
renderTarget.Render(drawingVisual);

PngBitmapEncoder pngEncoder = new PngBitmapEncoder();
pngEncoder.Frames.Add(BitmapFrame.Create(renderTarget));

Byte[] _imageArray;

using (MemoryStream outputStream = new MemoryStream())
{
pngEncoder.Save(outputStream);
_imageArray = outputStream.ToArray();
}

using (FileStream stream = new FileStream(@"c:\test.png", FileMode.Create, FileAccess.ReadWrite))
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(_imageArray);
}
}

return _imageArray;
}

最佳答案

首先,您需要为以下命名空间添加引用:

using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

然后枚举您的监视器以获取所有显示表面的边界矩形并将其传递给 Graphics.CopyFromScreen() 方法调用:

private static BitmapSource CopyScreen()
{
var left = Screen.AllScreens.Min(screen => screen.Bounds.X);
var top = Screen.AllScreens.Min(screen => screen.Bounds.Y);
var right = Screen.AllScreens.Max(screen => screen.Bounds.X + screen.Bounds.Width);
var bottom = Screen.AllScreens.Max(screen => screen.Bounds.Y + screen.Bounds.Height);
var width = right - left;
var height = bottom - top;

using (var screenBmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
{
using (var bmpGraphics = Graphics.FromImage(screenBmp))
{
bmpGraphics.CopyFromScreen(left, top, 0, 0, new System.Drawing.Size(width, height));
return Imaging.CreateBitmapSourceFromHBitmap(
screenBmp.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}
}
}

请记住,虽然显示器通常不能整齐地放入一个矩形中,尤其是当它们具有不同的分辨率等时,因此您最好对各个屏幕进行快照。无论哪种方式,您的问题的解决方案是更改您传递给 Graphics.CopyFromScreen() 方法调用的坐标。

编辑:请参阅下面 Demetris Leptos 的评论,我在此答案中发布的代码应该在 screenBmp.GetHbitmap() 返回的位图上调用 DeleteObject 以避免内存泄漏,因为在 MSDN 文档中指定。

关于c# - WPF:截取屏幕截图的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20338960/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com