WMF / EMF преобразование формата файла C # - PullRequest
5 голосов
/ 19 ноября 2009

В моей программе есть требование «воспроизводить» или «анализировать» метафайлы окон (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 ]

9 голосов
/ 02 февраля 2010

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

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

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

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

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

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

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

Обновление

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

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

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

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

3 голосов
/ 04 марта 2012

Проверить эту библиотеку: 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...