Экспорт из приложения на основе MSChart, вызывающий исключения для векторных форматов - PullRequest
0 голосов
/ 12 декабря 2011

Я пытаюсь экспортировать изображение MSChart.

Я нашел замечательную функцию

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

Однако у меня возникли некоторые проблемы с параметром ImageFormat.В частности, я хочу, чтобы пользователь мог сохранить изображение в любом формате, для которого у него есть кодировщик WIC .Для этого я получаю список кодеков Image и предоставляю их всем пользователю.

Таким образом, когда пользователь выбрал свой файл, я беру расширение и нахожу кодек в списке, который соответствует расширению.Затем я создаю соответствующий 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, но все равно выдаст исключение.

Кто-нибудь знает, почему это происходит, и есть решениемои проблемы?

1 Ответ

1 голос
/ 15 декабря 2011

Я думаю, что внутренне элемент управления графиком использует предоставленный вами формат изображения для выбора 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 () для двух форматов, вы увидите, что они не возвращают одно и то же.Вполне возможно, что код для выбора кодировщика не ожидал, что ImageFormat создан из GUID, а просто ищет список имен известных форматов.

При просмотре примеров mschart предпочтительным типом аргумента для этой функции является enumChartImageFormat, а не Imageformat.

Это не решит вашу проблему, но, надеюсь, сделает ее менее загадочной.

...