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

5
我正在使用Xamarin和C#在Mac上尝试抓取屏幕截图并保存到磁盘。我编写了以下代码:
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()方法。
谢谢。
2个回答

3
< p > CGImageDestination.Create 方法有三种不同的签名,如果您使用接受 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 方法:

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

public Boolean Close ()

将图像写入目标并处理对象的释放。

希望这可以帮助您。-


谢谢Apineda。在CGDataConsumer对象上调用dispose就行了。 - BVintila

1

1
仅仅链接到自己的库或教程并不是一个好的答案。链接到它,解释为什么它可以解决问题,提供如何实现的代码,并声明你编写了它,这样会得到更好的答案。参见:什么是“好”的自我推广? - 4b0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接