如何将System__ComObject转换为图像?

时间:2010-07-27 16:51:06

标签: c# com-interop

我正在使用DSOFile从某些Crystal Reports报表文件中获取摘要属性。 SummaryProperties.Thumbnail 返回一个对象,我需要将对象转换为图像,以便我可以在表单上将其显示为预览。我已经尝试将其转换为 System.Drawing.Image ,但我收到错误“ImageConverter无法从System .__ ComObject转换。”

2 个答案:

答案 0 :(得分:3)

它可能是图像,IPicture或IPictureDisp的COM接口。您可以使用AxHost.GetPictureFromIPicture或GetPictureFromIPictureDisp静态方法进行转换。

答案 1 :(得分:0)

我最后写了一个小包装类,它对我有用:

stdole.IPictureDisp iPictureDisp = row.Parent.Thumbnail;
pictureBox1.Image = IconTools.GetImage(iPictureDisp);

你会想要使用汉斯提到的AxHost。实施起来比我最初想的要复杂一点。请注意,您需要使用AxHost.GetPictureFromIPicture而不是GetPictureFromIPictureDisp

关于AxHost.GetPictureFromIPictureDisp:

  

此方法无法正常工作。你可以使用    GetPictureFromIPicture 方法将 IPictureDisp 对象转换为图片,但是,因为 IPictureDisp OLE   interface是 IPicture 界面的一个子集。

这是包装器:

public class IconTools
{
    private class IconToolsAxHost : System.Windows.Forms.AxHost
    {
        private IconToolsAxHost() : base(string.Empty) { }

        public static stdole.IPictureDisp GetIPictureDispFromImage(System.Drawing.Image image)
        {
            return (stdole.IPictureDisp)GetIPictureDispFromPicture(image);
        }

        public static System.Drawing.Image GetImageFromIPicture(object iPicture)
        {
            return GetPictureFromIPicture(iPicture);
        }
    }

    public static stdole.IPictureDisp GetIPictureDisp(System.Drawing.Image image)
    {
        return IconToolsAxHost.GetIPictureDispFromImage(image);
    }

    public static System.Drawing.Image GetImage(stdole.IPicture iPicture)
    {
        return IconToolsAxHost.GetImageFromIPicture(iPicture);
    }

    public static System.Drawing.Image GetImage(stdole.IPictureDisp iPictureDisp)
    {
        return IconToolsAxHost.GetImageFromIPicture(iPictureDisp);
    }
}