从基于MSChart的应用程序导出会引发向量格式异常

本文关键字:向量 异常 格式 MSChart 应用程序 | 更新日期: 2023-09-27 18:17:29

我正在尝试导出一个MSChart的图像。

我发现了这个奇妙的函数

[System.Windows.Forms.DataVisualization.Charting.Chart.SaveImage][1]

然而,我有一些问题与ImageFormat参数。我特别希望用户能够以任何格式保存图像,他们有一个WIC编码器。为此,我得到了图像编解码器的列表,并将它们全部提供给用户。

因此,当用户选择了他们的文件时,我抓住扩展名并在列表中找到与扩展名匹配的编解码器。然后创建相关的ImageFormat,如下所示:

ImageFormat imgFmt  = new ImageFormat( codec.FormatID );

然后调用以下命令导出图表:

exportChart.SaveImage( mSaveFileDialog.FileName, imgFmt );

但是,如果我选择EMF或WMF,则会抛出一个异常,如下所示:

A first chance exception of type 'System.ArgumentNullException' occurred in System.Drawing.dll
An unhandled exception of type 'System.ArgumentNullException' occurred in System.Drawing.dll
Additional information: Value cannot be null.
最奇怪的是,如果我创建我的图像格式如下:
ImageFormat imgFmt = ImageFormat.Emf;

则写入EMF没有问题。此外,如果我这样做(与原始imgFmt):

imgFmt.Equals( ImageFormat.Emf )

然后返回true,但仍然抛出异常。

有没有人知道为什么会发生这种情况,并有一个解决我的问题?

从基于MSChart的应用程序导出会引发向量格式异常

我认为在内部,图表控件使用您提供的ImageFormat来选择ImageCodecInfo。由于无法找到所述编解码器信息,因此抛出此异常。

ImageFormat fmt = ImageFormat.Emf;
ImageFormat fmt2 = new ImageFormat(ImageFormat.Emf.Guid);
Console.WriteLine(fmt.ToString()); // gives: Emf
Console.WriteLine(fmt2.ToString()); // gives: [ImageFormat: b96b3cac-0728-11d3-9d7b-0000f81ef32e]

如果对这两种格式调用ToString(),您将看到它们返回的结果不同。选择编码器的代码很可能没有预料到从GUID构造的ImageFormat,而只是查找已知格式名称的列表。

查看mschart示例,该函数的首选参数类型是enum ChartImageFormat,而不是Imageformat。

这并不能解决你的问题,但希望能使它不那么神秘。