Преобразование формата файла WMF / EMF С#

В моей программе у меня есть требование «воспроизведения» или «анализа» метафайлов Windows (WMF и EMF). Я копался в MSDN и Google, и самое близкое, что я нашел, это графика. Метод EnumerateMetafile. Я могу заставить его работать, потому что вызывается мой обратный вызов EnumerateMetafileProc, а затем я могу вызвать PlayRecord. Чего не хватает, так это того, как получить полезные данные из этого обратного вызова.

Пример, который я просмотрел: http://msdn.microsoft.com/en-us/library/ms142060.aspx

Обратный вызов имеет параметр RecordType, который является ENUM. Что ж, это выглядит полезно, за исключением того, что, похоже, нет способа привести данные к какому-либо полезному типу.

Моя цель — воспроизвести создание WMF/EMF, чтобы я мог вызывать функции для специализированного графического класса, который имеет такие методы, как (DrawLine, DrawPoint, DrawArc). В каком-то смысле я воссоздаю рисунок WMF/EMF в совершенно другом формате (Конвертация).

Любая помощь в этом очень ценится.


person FlaCracker    schedule 19.11.2009    source источник
comment
могу я спросить, какой у вас формат назначения? (Если это PDF, вам действительно следует проверить использование драйвера принтера PDF)   -  person Jason D    schedule 26.11.2009


Ответы (2)


Graphics.EnumerateMetafile, к сожалению, представляет собой очень и очень тонкий слой API Win32. Для каждой записи в EMF вы получаете адрес неуправляемой памяти для структуры, относящейся к записи. Нет документации о том, что он может содержать, но в мире Win32 тоже нечего делать.

Так что вам нужно обратиться к древним текстам!

К этой книге прилагается компакт-диск с образцом кода который включает примеры программ для использования API воспроизведения EMF.

Это оставляет вам две проблемы.

  1. Книга, по-видимому, больше не издается, поэтому убедитесь, что любая использованная копия, которую вы покупаете, включает рабочий компакт-диск.

  2. Код примера полностью написан на C/C++, и будет нетривиальной задачей объявить необходимое взаимодействие для 100 или около того структур, которые используются для описания всех записей EMF.

Таким образом, другой подход может состоять в том, чтобы объявить огромный интерфейс в .NET, у которого есть метод для каждого вызова GDI, который вам нужно перехватить, а затем использовать C++/CLI для адаптации примера кода C++, чтобы он вызывал ваш огромный интерфейс для каждой записи.

Обновить

Хотя документация MSDN для воспроизведения EMF не содержит сведений о конкретных записях EMF, Microsoft отдельно опубликовала полную спецификацию по состоянию на 2006 год:

MS- EMF: расширенный формат метафайла

Также автор книги, на которую я ссылался выше, сделал исходный код образцов компакт-диска доступным для скачивания:

Исходный код для программирования графики Windows

person Daniel Earwicker    schedule 02.02.2010

Проверьте эту библиотеку: http://wmf.codeplex.com/

Идея состоит в том, чтобы перебирать записи WMF и преобразовывать формы, кисти и т. д. в другой формат.

WmfDocument wmf = new WmfDocument();
wmf.Load(path);

foreach (var record in wmf.Records)
{
  if (record is WmfCreateBrushIndirectRecord)
  {
    var brush = record as WmfCreateBrushIndirectRecord;
    Console.WriteLine("Color: " + brush.Color);
    Console.WriteLine("Style: " + brush.Style);
    Console.WriteLine("Hatch: " + brush.Hatch);
    //Do something with brush here...
  }
  else if (record is WmfRectangleRecord)
  {
    var rectangle = record as WmfRectangleRecord;
    //Do something with rectangle...
  }
  else if ... //Other shapes to be implemented
}
person Papn Kukn    schedule 04.03.2012