如何通过拖放在 Winform 中将元文件转换为图像
Posted
技术标签:
【中文标题】如何通过拖放在 Winform 中将元文件转换为图像【英文标题】:How to Convert a Metafile to Image by Drag'n'Droping in a Winform 【发布时间】:2011-05-21 11:49:20 【问题描述】:我用 C# 中的框架 .NET 3.5 开发了一个 Winform 应用程序。 我想让用户从 Word 2007 中拖放图片。基本上,用户打开 docx,选择一张图片并将它们拖放到我的 PictureBox 中。
我已经对我的桌面和 Internet 页面中的图片文件进行了相同的处理,但我无法解决我的 Metafile 问题。我做了一些研究,但没有找到任何解决我的问题的解决方案。
这是我在 Drag&Drop 活动中所做的:
private void PictureBox_DragDrop(object sender, DragEventArgs e)
if (e.Data.GetDataPresent(DataFormats.MetafilePict))
Image image = new Metafile((Stream)e.Data.GetData(DataFormats.MetafilePict));
我可以使用以下代码获取流:(Stream)e.Data.GetData(DataFormats.MetafilePict) 但我不知道如何将其转换为 Metafile 或更好的 Image 对象。
如果您有任何想法或解决方案,我很乐意阅读。
谢谢,
【问题讨论】:
【参考方案1】:这是一个从 Word 拖放的工作示例(不适用于 PowerPoint 和 Excel):
static Metafile GetMetafile(System.Windows.Forms.IDataObject obj)
var iobj = (System.Runtime.InteropServices.ComTypes.IDataObject)obj;
var etc = iobj.EnumFormatEtc(System.Runtime.InteropServices.ComTypes.DATADIR.DATADIR_GET);
var pceltFetched = new int[1];
var fmtetc = new System.Runtime.InteropServices.ComTypes.FORMATETC[1];
while (0 == etc.Next(1, fmtetc, pceltFetched) && pceltFetched[0] == 1)
var et = fmtetc[0];
var fmt = DataFormats.GetFormat(et.cfFormat);
if (fmt.Name != "EnhancedMetafile")
continue;
System.Runtime.InteropServices.ComTypes.STGMEDIUM medium;
iobj.GetData(ref et, out medium);
return new Metafile(medium.unionmember, true);
return null;
private void Panel_DragDrop(object sender, DragEventArgs e)
if (e.Data.GetDataPresent(DataFormats.EnhancedMetafile) & e.Data.GetDataPresent(DataFormats.MetafilePict))
Metafile meta = GetMetafile(e.Data);
Image image = meta;
之后你可以使用image.Save来保存图片,也可以在picturebox或其他控件上使用。
【讨论】:
【参考方案2】:我认为您需要调用 new Metafile(stream),因为Metafile 中没有方法 .FromStream。
【讨论】:
是的,这是真的。我已经尝试过你的方法,但我在 GDI+ 中遇到了错误。我怎么知道我的 Stream 是哪种对象类型? 在此处查看 MetaFilePict 文档:msdn.microsoft.com/en-us/library/… - 也许这是您的情况。否则,应该工作......【参考方案3】:我仍在研究他的网络以尝试不同的方法来解决我的问题。 希望我发现这个未回答的线程谈论我的问题但没有任何回应: 获取拖放 MS Word 图像 + DataFormats.EnhancedMetafile 和 MetafilePict :
http://www.codeguru.com/forum/showthread.php?t=456722
我使用另一个 io 来解决问题,该 io 能够使用 Word 2003 复制浮动图像(存储在 Shape 中而不是 InlineShape 中的图像)并粘贴到我的 winform 中。我无法粘贴第二个来源的链接(因为我在此网站上的声誉较低),但如果有人要求,我会这样做。
因此,显然存在一个常见问题,即您无法通过拖放访问存储在剪贴板中的元文件。
我仍然需要了解如何通过拖放来获取我的元文件。
【讨论】:
以上是关于如何通过拖放在 Winform 中将元文件转换为图像的主要内容,如果未能解决你的问题,请参考以下文章