Uwp 从剪贴板获取大数据

Uwp 从剪贴板获取大数据,uwp,clipboard,copy-paste,Uwp,Clipboard,Copy Paste,我正在尝试使用UWP应用程序可用的Windows.ApplicationModel.DataTransfer.Clipboard类来读取剪贴板的内容(尤其对粘贴图像数据感兴趣) 以下是我的示例代码: var clipboardContent = Clipboard.GetContent(); if (clipboardContent.Contains(StandardDataFormats.Bitmap)) { var bitmap = await clipboardContent.Ge

我正在尝试使用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\U位图格式 无法转换为流对象

其他信息:可用内存不足,无法访问 完成操作

导致这种情况的图像示例如下:

即使图像大小约为9.5MB,如果您在浏览器中打开图像并将其复制到剪贴板中,然后尝试使用上述代码将其粘贴到UWP应用程序中,那么您将遇到内存不足的问题


有办法解决这个问题吗?

谢谢您的反馈。当我使用x86平台构建并多次粘贴时,我可以重现这个问题。正如异常的附加信息所述,我们得到此异常是因为
没有足够的内存来完成操作

如果我们在调试时使用,我们会发现当我们粘贴您提供的映像时,它会消耗大量内存(在我这边接近2GB),如下所示:

因此,在内存不足的设备中,可能没有足够的内存来完成粘贴操作

此外,虽然图像只有9.5MB左右,但这是JPEG格式的,已经被压缩。这个图像包含13500*13500像素,如果我们把它转换成BMP格式,它的大小会增加到521MB左右


我已经在内部报告了这个问题,一旦有任何进展,我将更新我的答案。现在,我建议您捕捉这个错误并给用户一些提示。或者,如果可以控制复制操作,则可以使用方法通过延迟渲染进行复制。在我的测试中,这将大大减少内存占用。

感谢您的反馈。当我使用x86平台构建并多次粘贴时,我可以重现这个问题。正如异常的附加信息所述,我们得到此异常是因为
没有足够的内存来完成操作

如果我们在调试时使用,我们会发现当我们粘贴您提供的映像时,它会消耗大量内存(在我这边接近2GB),如下所示:

因此,在内存不足的设备中,可能没有足够的内存来完成粘贴操作

此外,虽然图像只有9.5MB左右,但这是JPEG格式的,已经被压缩。这个图像包含13500*13500像素,如果我们把它转换成BMP格式,它的大小会增加到521MB左右


我已经在内部报告了这个问题,一旦有任何进展,我将更新我的答案。现在,我建议您捕捉这个错误并给用户一些提示。或者,如果可以控制复制操作,则可以使用方法通过延迟渲染进行复制。在我的测试中,这将大大减少内存占用。

我无法重现您的问题。我用你的代码和你提供的图像进行了测试,它在我这边运行得很好。您能提供一些关于测试环境的详细信息吗?我有一个WebView,在该页面中托管一个带有CKEditor+JavaScript的页面,该页面检测粘贴操作,并使用window.external.notify通知我的C#代码隐藏。然后,我运行上面的代码加载粘贴的图像数据,对其进行操作,然后将其插入WebView内部的CKEditor。我想这也取决于一台机器有多少空闲内存。我在surface pro设备上运行,运行多个应用程序(包括visual studio)。我认为GetBitmapAsync()可以让我一次读取剪贴板数据块,不管它有多大。但似乎不是这样!我无法复制你的问题。我用你的代码和你提供的图像进行了测试,它在我这边运行得很好。您能提供一些关于测试环境的详细信息吗?我有一个WebView,在该页面中托管一个带有CKEditor+JavaScript的页面,该页面检测粘贴操作,并使用window.external.notify通知我的C#代码隐藏。然后,我运行上面的代码加载粘贴的图像数据,对其进行操作,然后将其插入WebView内部的CKEditor。我想这也取决于一台机器有多少空闲内存。我在surface pro设备上运行,运行多个应用程序(包括visual studio)。我认为GetBitmapAsync()可以让我一次读取剪贴板数据块,不管它有多大。但似乎不是这样!您建议使用DataPackage.SetDataProvider。您有解决方案吗?您建议使用DataPackage.SetDataProvider。你有解决这个问题的办法吗?