2017-08-16 10 views
3

私はスクリーンショットをつかみ、MacのXamarinとC#を使ってディスクに保存しようとしています。私は以下のコードを書いた: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メソッドには、CGDataConsumerの代わりにNSUrlを受け入れるメソッドを使用する場合、3つの異なるシグネチャがあります。あなたがCGDataConsumerを作成する必要はありませんこの1で

var imageDestination = CGImageDestination.Create(fileURL, UTType.PNG, 1); 

しかし、あなたが本当に

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

関連する問題