Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin-如何使用Xamarin mac获取屏幕截图并将其保存在磁盘上?_C#_Macos_Xamarin_Screenshot_Xamarin.mac - Fatal编程技术网

C# Xamarin-如何使用Xamarin mac获取屏幕截图并将其保存在磁盘上?

C# Xamarin-如何使用Xamarin mac获取屏幕截图并将其保存在磁盘上?,c#,macos,xamarin,screenshot,xamarin.mac,C#,Macos,Xamarin,Screenshot,Xamarin.mac,我正试图抓取一张截图,并使用Xamarin和Mac上的C#将其保存在磁盘上。我写了下面的代码: public static void TakeScreenshotAndSaveToDisk(string path) { var fullScreenBounds = NSScreen.MainScreen.Frame; IntPtr ptr = CGWindowListCreateImage(fullScreenBounds, CGWindowListOpt

我正试图抓取一张截图,并使用Xamarin和Mac上的C#将其保存在磁盘上。我写了下面的代码:

public static void TakeScreenshotAndSaveToDisk(string path)
    {
        var fullScreenBounds = NSScreen.MainScreen.Frame;
        IntPtr ptr = CGWindowListCreateImage(fullScreenBounds, CGWindowListOption.OnScreenAboveWindow, 0, CGWindowImageOption.Default);
        var cgImage = new CGImage(ptr);
        var fileURL = new NSUrl(path, false);
        var imageDestination = CGImageDestination.Create(new CGDataConsumer(fileURL), UTType.PNG, 1);
        imageDestination.AddImage(cgImage);
        imageDestination.Close();
        imageDestination.Dispose();
        fileURL.Dispose();
        cgImage.Dispose();
    }
该方法执行,文件显示在正确的位置。如果我尝试打开它,它将显示空白。如果我在文件上单击“获取信息”,它将不会显示预览。 在我关闭应用程序后,可以打开图像,“获取信息”显示预览

我做错了什么?在我看来,即使我对对象调用Dispose(),资源也不会被释放


谢谢。

CGImageDestination.Create方法有3个不同的签名,如果您使用接受NSUrl的签名而不是
CGDataConsumer
,您应该会很好

var imageDestination = CGImageDestination.Create(fileURL, UTType.PNG, 1);
有了这个,你不需要创建一个
CGDataConsumer
,但是如果你真的想/需要的话

var dataConsumer = new CGDataConsumer(fileURL);
var imageDestination = CGImageDestination.Create(dataConsumer, UTType.PNG, 1);
imageDestination.AddImage(cgImage);
imageDestination.Close();
dataConsumer.Dispose();
保存文件后,请确保处置该实例

使用
方法:

using (var dataConsumer = new CGDataConsumer(fileURL))
{
    var imageDestination = CGImageDestination.Create(dataConsumer, UTType.PNG, 1);
    imageDestination.AddImage(cgImage);
    imageDestination.Close();
}
注意:对于不需要手动处理的
CGImageDestination
Close
方法也会处理对象(基于文档)

公共布尔关闭()

将图像写入目标并处理对象


希望这能有所帮助。-

我可能做得晚了,但我刚刚用Xamarin.Mac实现了它,并且可以在无头模式下使用:


它依赖于“新的”CoreGraphics绑定(一些已经存在于Xamarin.Mac中,但是是内部的或私有的)来检测显示并枚举它们。最后,每次显示一个屏幕截图,将其保存为给定路径中的PNG。

谢谢Apineda。对CGDataConsumer对象调用dispose就成功了。仅仅链接到您自己的库或教程并不是一个好的答案。链接到它,解释它解决问题的原因,提供关于如何解决问题的代码,并否认您编写了它,这有助于获得更好的答案。见: