C# Xamarin-如何使用Xamarin mac获取屏幕截图并将其保存在磁盘上?
我正试图抓取一张截图,并使用Xamarin和Mac上的C#将其保存在磁盘上。我写了下面的代码: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
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就成功了。仅仅链接到您自己的库或教程并不是一个好的答案。链接到它,解释它解决问题的原因,提供关于如何解决问题的代码,并否认您编写了它,这有助于获得更好的答案。见: