我正在使用DSOFile从一些Crystal Reports报告文件中获取摘要属性。 SummaryProperties.Thumbnail 返回一个对象,我需要将该对象转换为图像,以便在我的表单上显示预览。 我尝试将其强制转换为 System.Drawing.Image,但是我收到一个错误消息“ImageConverter无法从System.__ComObject进行转换。”
我正在使用DSOFile从一些Crystal Reports报告文件中获取摘要属性。 SummaryProperties.Thumbnail 返回一个对象,我需要将该对象转换为图像,以便在我的表单上显示预览。 我尝试将其强制转换为 System.Drawing.Image,但是我收到一个错误消息“ImageConverter无法从System.__ComObject进行转换。”
这可能是与图像相关的COM接口,如IPicture或IPictureDisp。您可以使用AxHost.GetPictureFromIPicture或GetPictureFromIPictureDisp静态方法进行转换。
我最终写了一个小的包装类,对我很有效:
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);
}
}