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.
Это оставляет вас с двумя проблемами.
Книга явно не в печати, поэтому убедитесь, что любая использованная вами копия содержит рабочий CD-ROM.
Все примеры кода написаны на C/C++, и объявить необходимое взаимодействие для примерно 100 структур, используемых для описания всех записей EMF, будет нетривиальной задачей.
Таким образом, другой подход может заключаться в объявлении огромного интерфейса в.NET, который имеет метод для каждого вызова GDI, который необходимо перехватить, а затем использовать C++/CLI для адаптации примера кода C++, чтобы он вызывал ваш огромный интерфейс для каждой записи.
Обновить
Хотя документация MSDN для воспроизведения EMF не содержит подробностей о конкретных записях EMF, Microsoft отдельно опубликовала полную спецификацию на 2006 год:
MS-EMF: расширенный формат метафайлов
Также автор книги, на которую я ссылался выше, сделал доступным для скачивания исходный код примеров CDROM:
Проверьте эту библиотеку: 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
}