2016-08-29 38 views
1

大數據我試圖使用Windows.ApplicationModel.DataTransfer.Clipboard類可供UWP應用程序讀取剪貼板內容(在粘貼圖像數據特別感興趣)。獲取剪貼板

這裏是我的示例代碼:

var clipboardContent = Clipboard.GetContent(); 
if (clipboardContent.Contains(StandardDataFormats.Bitmap)) 
{ 
    var bitmap = await clipboardContent.GetBitmapAsync(); 
    if (bitmap != null) 
    { 
     var stream = (await bitmap.OpenReadAsync()).AsStream(); 
     // do something with the data in the stream 
    } 
} 

這工作正常較小的圖像。但是,當圖像較大,則clipboardContent.GetBitmapAsync()將拋出一個異常:

「System.Runtime.InteropServices.COMException」類型 的異常出現在mscorlib.ni.dll但在用戶沒有處理代碼

WinRT信息:源應用程序 提供的CF_BITMAP格式不能轉換爲流對象。

附加信息: 完整操作的內存不足。

導致這http://eoimages.gsfc.nasa.gov/images/imagerecords/79000/79765/dnb_land_ocean_ice.2012.13500x13500.A1.jpg

即使圖像〜9.5MB,如果你在瀏覽器中打開它,它在剪貼板複製,然後嘗試將其粘貼到圖片的例子UWP應用程序使用上面的代碼,那麼你會遇到內存不足的問題。

有沒有辦法解決這個問題?

+0

我無法重現您的問題。我測試你的代碼和你提供的圖像,它在我身邊很好。你能提供一些關於你的測試環境的細節嗎? –

+0

我有一個WebView託管一個頁面,該頁面中的CKEditor + JavaScript檢測粘貼操作並使用window.external.notify通知我的C#代碼。然後我運行上面的代碼來加載粘貼的圖像數據,對其進行處理,然後將其插入到WebView中的CKEditor中。 我想這也取決於一臺機器有多少可用空間。我在運行多個應用程序(包括Visual Studio)的Surface Pro設備上運行。 我以爲GetBitmapAsync()將允許我一次讀取剪貼板數據的小塊,不管它有多大。但似乎並非如此! –

回答

0

感謝您的反饋。當我使用x86平臺構建並粘貼多次時,我可以重現此問題。由於例外的附加信息說,我們得到了這個例外,因爲There is insufficient memory available to complete operation

如果我們使用Diagnostic Tools在調試時,我們可以發現,當我們粘貼您提供的圖片,它的成本大量的內存(2GB近在我的身邊),如下列:
enter image description here

所以這是可能的,在低內存設備中,沒有足夠的內存來完成粘貼操作。

此外,雖然圖像只有近9.5 MB,但這是JPEG格式,它已被壓縮。而這個圖像包含13500 * 13500像素,如果我們將其轉換爲BMP格式,其大小將增加到約521 MB。

我已經在內部報告過這個問題,一旦有任何進展,我會更新我的答案。現在,我建議你趕上這個錯誤,並給用戶一些提示。或者如果您控制了複製操作,則可以使用DataPackage.SetDataProvider方法複製延遲渲染。正如在我的測試中,這將顯着減少內存佔用。