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

В моей программе есть требование "воспроизводить" или "анализировать" метафайлы 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 в совершенно другом формате (Конвертация).

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

2 ответа

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

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

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

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

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

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

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

Обновить

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

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

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

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

Проверьте эту библиотеку: 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
}
Другие вопросы по тегам