我尝试使用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格式 无法转换为流对象。
其他信息:内存不足 完成操作。
即使图像大约是9.5MB,如果你在浏览器中打开它并将其复制到剪贴板中然后尝试使用上面的代码将其粘贴到UWP应用程序中,那么你就会遇到内存不足问题。
有办法解决这个问题吗?
答案 0 :(得分:0)
感谢您的反馈。当我使用x86平台构建并多次粘贴时,我可以重现此问题。正如异常的附加信息所说,我们得到了这个例外,因为There is insufficient memory available to complete operation
。
如果我们在调试时使用Diagnostic Tools,我们会发现当我们粘贴您提供的图像时,会花费大量内存(我身边接近2GB),如下所示:
因此,在低内存设备中,没有足够的内存来完成粘贴操作。
此外,尽管图像仅接近9.5 MB,但这是JPEG格式,已经过压缩。此图像包含13500 * 13500像素,如果我们将其转换为BMP格式,其大小将增加到大约521 MB。
我已在内部报告此问题,一旦有任何进展,我会更新我的答案。现在,我建议你抓住这个错误并给用户一些提示。或者,如果您可以控制复制操作,则可以使用DataPackage.SetDataProvider方法复制延迟渲染。在我的测试中,这将显着减少内存占用。