2017-08-16 45 views
3

我試圖抓住屏幕截圖並使用Xamarin和C#在Mac上將其保存在磁盤上。我寫了下面的代碼:Xamarin - 如何獲取截圖並使用xamarin 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(),資源也不會被釋放。

謝謝。

回答

1

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方法:

using (var dataConsumer = new CGDataConsumer(fileURL)) 
{ 
    var imageDestination = CGImageDestination.Create(dataConsumer, UTType.PNG, 1); 
    imageDestination.AddImage(cgImage); 
    imageDestination.Close(); 
} 

注意:爲CGImageDestination你不需要手動配置,該Close方法也將部署(基於文檔)的對象。

公共布爾關閉()

寫入圖像到目的地並配置對象。

希望這helps.-

+0

感謝Apineda。在CGDataConsumer對象上調用dispose是個竅門。 – BVintila

相關問題