从剪贴板获取大数据

时间:2016-08-29 23:19:56

标签: uwp clipboard copy-paste

我尝试使用UWP应用程序可用的 Windows.ApplicationModel.DataTransfer.Clipboard 类来阅读剪贴板内容(特别是对粘贴图像感兴趣)数据)。

以下是我的示例代码:

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应用程序中,那么你就会遇到内存不足问题。

有办法解决这个问题吗?

1 个答案:

答案 0 :(得分: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方法复制延迟渲染。在我的测试中,这将显着减少内存占用。