如何通过拖放在 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 中将元文件转换为图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中将 SVG 文件转换为 EMF 文件

如何在 Python 中将 Azure Blob 文件 CSV 转换为 Excel

WinForm下的TabControl控件

在typo3中将元标记放在标题部分的顶部

Python中将元组转换成列表

在 Python 中将 .mdb 文件转换为 .csv 时包括列名