我正在尝试导出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但仍然抛出异常。
有没有人知道为什么会这样,并解决我的问题?
答案 0 :(得分:1)
我认为图表控件在内部使用您提供的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示例,此函数的首选参数类型是枚举ChartImageFormat,而不是Imageformat。
这并不能解决你的问题,但希望它不那么神秘。