如何将System__ComObject转换为图像?

3

我正在使用DSOFile从一些Crystal Reports报告文件中获取摘要属性。 SummaryProperties.Thumbnail 返回一个对象,我需要将该对象转换为图像,以便在我的表单上显示预览。 我尝试将其强制转换为 System.Drawing.Image,但是我收到一个错误消息“ImageConverter无法从System.__ComObject进行转换。”

2个回答

3

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


我花了更多的时间在谷歌上搜索,才发现我必须实现AxHost才能使用GetPictureFromIPicture方法,但是我搞定了,谢谢。 - jac

0

我最终写了一个小的包装类,对我很有效:

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

你需要使用AxHost,正如Hans所提到的那样。不过实现起来比我最初想的要棘手一些。请注意,你将需要使用AxHost.GetPictureFromIPicture而不是GetPictureFromIPictureDisp

关于AxHost.GetPictureFromIPictureDisp:

这个方法无法正确地工作。您可以使用GetPictureFromIPicture方法将IPictureDisp对象转换为Image,因为IPictureDisp OLE接口是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);
    }
}

这与我最终得到的非常相似。我获取缩略图对象并将其传递给我的IPictureDispHost类。该类实现了一个静态方法,Image GetPictureFromIPicture(object picture)。 - jac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接