gpt4 book ai didi

c# - 为什么我从 Clipboard 类收到 OutOfMemoryException 异常?

转载 作者:行者123 更新时间:2023-12-03 11:12:37 32 4
gpt4 key购买 nike

我正在尝试使用 System.Windows.Clipboard从剪贴板获取图像的类:

var bitmapSource = System.Windows.Clipboard.GetImage();

当通过 PrintScreen 键复制图像时,它工作正常。但是,当从医疗应用程序复制图像时,出现以下异常:

System.OutOfMemoryException: Insufficient memory to continue the execution of the program.
at System.Runtime.InteropServices.ComTypes.IDataObject.GetData(FORMATETC& format, STGMEDIUM& medium)
at System.Windows.DataObject.OleConverter.GetDataInner(FORMATETC& formatetc, STGMEDIUM& medium)
at System.Windows.DataObject.OleConverter.GetDataFromOleOther(String format, DVASPECT aspect, Int32 index)
at System.Windows.DataObject.OleConverter.GetData(String format, Boolean autoConvert, DVASPECT aspect, Int32 index)
at System.Windows.DataObject.OleConverter.GetData(String format, Boolean autoConvert)

图像在 Paint 和 Word 上粘贴良好,因此图像被正确复制到剪贴板。这不是一个巨大的图像,所以我绝对没有内存不足。有任何想法吗?

调用 Clipboard.GetDataObject().GetFormats()返回以下内容:

{string[11]}
[0]: "Rich Text Format"
[1]: "MetaFilePict"
[2]: "PNG+Office Art"
[3]: "Office Drawing Shape Format"
[4]: "DeviceIndependentBitmap"
[5]: "Bitmap"
[6]: "System.Drawing.Bitmap"
[7]: "System.Windows.Media.Imaging.BitmapSource"
[8]: "Format17"
[9]: "EnhancedMetafile"
[10]: "System.Drawing.Imaging.Metafile"

我试过 Clipboard.GetData(format)对于上述每种格式,唯一返回非空对象的是“PNG+Office Art”、“Office Drawing Shape Format”、“Format17”和“EnhancedMetafile”。

最佳答案

我相信你的答案是here .简而言之:

the conclusion is that if you are working with the Clipboard in WPF and you are getting System.OutOfMemoryExceptions that don’t seem to make any sense, then you’ve probably forgotten to add the SerializableAttribute to whatever class you placed on the Clipboard.



那么这个医疗应用程序是您的应用程序吗?因为看起来问题在于如何将图像放入剪贴板,而不是如何检索图像。

更新:由于它不是您的应用程序,因此您可能不得不忍受他们的错误(或 Clipboard.GetData() 中的错误)。 The source code of Clipboard.GetImage() 这是:
public static Image GetImage() {
var dataObject = Clipboard.GetDataObject();
if (dataObject != null) {
return dataObject.GetData(DataFormats.Bitmap, true) as Image;
}

return null;
}

请注意,您的堆栈跟踪表明异常发生在 GetData() 中。 .查看源代码,这意味着调用 GetDataObject()有效,这意味着您(理论上)可以使用 GetDataObject() 自己并转换 IDataObject 从那个变成你可以使用的东西。

可能需要一些探索才能弄清楚发生了什么。您也许可以使用 IDataObject.GetFormats() 检查它是什么,然后使用 IDataObject.GetData() 以该格式获取数据。

更新 2:来自 here 的解决方案为我们指明了正确的方向,但需要一些修改:
var data = Clipboard.GetDataObject();
var ms = (MemoryStream) data.GetData("PNG+Office Art");

var image = Image.FromStream(ms)

关于c# - 为什么我从 Clipboard 类收到 OutOfMemoryException 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53856434/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com