代码之家  ›  专栏  ›  技术社区  ›  Dirk Vollmar

如何将IPictureDisp转换为System.Drawing.Image

  •  2
  • Dirk Vollmar  · 技术社区  · 16 年前

    最好的方法是什么?

    internal sealed class IPictureDispHost : AxHost
    {
        /// <summary>
        /// Default Constructor, required by the framework.
        /// </summary>
        private IPictureDispHost() : base(string.Empty) { }
        /// <summary>
        /// Convert the image to an ipicturedisp.
        /// </summary>
        /// <param name="image">The image instance</param>
        /// <returns>The picture dispatch object.</returns>
        public new static object GetIPictureDispFromPicture(Image image)
        {
            return AxHost.GetIPictureDispFromPicture(image);
        }
        /// <summary>
        /// Convert the dispatch interface into an image object.
        /// </summary>
        /// <param name="picture">The picture interface</param>
        /// <returns>An image instance.</returns>
        public new static Image GetPictureFromIPicture(object picture)
        {
            return AxHost.GetPictureFromIPicture(picture);
        }
    }
    
    ...
    
    // somewhere later the conversion gets called
    Image image = IPictureDispHost.GetPictureFromIPicture(picture);
    

    这是异常堆栈跟踪:

    System.NotImplementedException: The method or operation is not implemented.
       at System.Windows.Forms.UnsafeNativeMethods.IPicture.GetHandle()
       at System.Windows.Forms.AxHost.GetPictureFromIPicture(Object picture)
       at DocumentViewer.IPictureDispHost.GetPictureFromIPicture(Object picture)
    

    我在我的项目中引用了stdole、system.windows.forms和system.drawing。我错过什么了吗?

    4 回复  |  直到 16 年前
        1
  •  3
  •   petr k.    16 年前

    看看这个 article .

    它描述了三个不同的选择,你只需选择一个你认为最容易或“最干净”为你的目的(包括一个你声称不为你工作)。

        2
  •  2
  •   Dirk Vollmar    16 年前

    从Microsoft Office Document Imaging COM组件获取的图片似乎不是有效的IPictureDisp对象,因此似乎无法转换它。

        3
  •  0
  •   Dirk Vollmar    16 年前

    你试过了吗?

    picture1.image = Microsoft.VisualBasic.Compatibility.VB6.Support.IPictureDispToImage(pict)
    
        4
  •  0
  •   George    16 年前

    Microsoft.VisualBasic.Compatibility.vb6.Support.IPictureDispToImage不保证在将来的更新中始终包含。所以…以身作则 http://support.microsoft.com/kb/555417 我想出了以下几点

    例子

    公共类ImageToPictureDispConverter

    Inherits System.Windows.Forms.AxHost
    
    Public Sub New()
        MyBase.New("{63109182-966B-4e3c-A8B2-8BC4A88D221C}")
    End Sub
    
    Public Function GetImageFromIPictureDisp(ByVal objImage As stdole.IPictureDisp) As System.Drawing.Image
        Dim objPicture As System.Drawing.Image
        objPicture = CType(MyBase.GetPictureFromIPicture(objImage), System.Drawing.Image)
    
        Return objPicture
    End Function
    

    端类

    我在构造函数中看到您传递了一个空字符串。我最后不得不通过以下字符串“63109182-966B-4E3C-A8B2-8BC4A88D221C”。如果传递空字符串,则会收到System.FormatException错误。看起来你已经拥有了我所拥有的一切,除了这个字符串。

    希望这有帮助。