Windows Metafile ( WMF ) — формат файла изображения , изначально разработанный для Microsoft Windows в 1990-х годах. Исходный формат Windows Metafile не был аппаратно-независимым (хотя его можно было сделать более аппаратно-независимым с помощью заголовков размещения) и может содержать как векторную графику, так и компоненты растрового изображения . Он действует аналогично файлам SVG . Позднее файлы WMF были заменены расширенными метафайлами (файлами EMF), которые обеспечивали аппаратно-независимость. Затем файлы EMF сами были улучшены с помощью файлов EMF+ .
По сути, метафайл хранит список записей, состоящий из команд рисования, определений свойств и графических объектов для отображения изображения на экране. [1] Используемые команды рисования тесно связаны с командами API интерфейса графических устройств (GDI), используемого для рисования в Microsoft Windows.
Существует три основных типа метафайлов: WMF — это 16-битный формат, представленный в Windows 3.0 . Это собственный векторный формат для приложений Microsoft Office , таких как Word , PowerPoint и Publisher . По состоянию на 2023 год [обновлять]доступна редакция 17 спецификации формата метафайлов Windows. [2] Файлы EMF, которые заменили файлы WMF, работают по тому же принципу, только это 32-битный формат файла, который также позволяет встраивать личные данные в записи «комментариев». [3] EMF+ — это расширение файлов EMF, встроенное в эти записи комментариев, позволяющее использовать изображения и текст с помощью команд, объектов и свойств, аналогичных Windows GDI+ . [4]
Оригинальный 16-битный формат файла WMF был полностью описан в томе 4 документации Windows 3.1 SDK 1992 года [5] (по крайней мере, в сочетании с описаниями отдельных функций и структур в других томах), но эта спецификация была расплывчатой в отношении некоторых деталей. Эти руководства были опубликованы в виде печатных книг, доступных в книжных магазинах, без каких-либо ограничений по клику EULA или других необычных ограничений по лицензированию (только общее предупреждение о том, что если оно будет куплено как часть пакета программного обеспечения, программное обеспечение будет подпадать под одно из них).
Со временем существование этой исторической спецификации было в значительной степени забыто, и некоторые альтернативные реализации прибегали к обратному проектированию, чтобы выяснить формат файла из существующих файлов WMF, что было сложно и подвержено ошибкам. [6] В сентябре 2006 года Microsoft снова опубликовала спецификацию формата файла WMF в более полной форме [7] в контексте Microsoft Open Specification Promise , пообещав не заявлять патентные права разработчикам формата файла. [8]
Microsoft позже отказалась от файлов WMF в пользу 32-битных файлов EMF, поскольку файлы WMF имели реальные проблемы с независимостью от устройств, несмотря на использование «размещаемого» заголовка файла, который обеспечивал базовую независимость от устройств. Microsoft обнаружила, что разработчики, использующие этот формат, «внедряли комментарии о приложении, местоположении или масштабировании в метафайлы... Другие добавляли заголовки в метафайл, которые предоставляли различную информацию, специфичную для приложения», что вызывало серьезные проблемы совместимости. [9] Таким образом, в 1992 году с Windows NT 3.1 Microsoft представила формат Enhanced Metafile (EMF) [10] — формат, основанный на Win32 API, с помощью которого они встроили независимость от устройств. [11] [9] — они также были известны как метафайлы NT. [12] С выпуском Windows XP и GDI+ набор записей должен был быть значительно увеличен, и поэтому Microsoft выпустила EMF+ как расширение существующего формата файла EMF. [10] [13]
Файлы WMF, EMF и EMF+ состоят из серии записей, которые воспроизводятся для создания графического вывода. Некоторые записи определяют объекты, которые могут указывать графические объекты, используемые для определения того, как должна быть нарисована графика (например, перья указывают цвет и ширину линий). Каждый из этих объектов хранится в метафайлах и помещается в таблицу объектов, которая отслеживает использование графических объектов при обработке метафайла. Таблица объектов представляет собой ассоциативный массив индексов для структур графических объектов, определенных в метафайле.
Файлы WMF и EMF обрабатывают объекты по-разному, чем записи EMF+ в файлах EMF. По мере обработки файла WMF и EMF записи считываются в таблицу объектов после определения объекта. Если объект удаляется, то объект освобождается из таблицы, и идентификатор может быть использован повторно. В частности, объект не будет использоваться, пока он не будет специально выбран во время воспроизведения записи. [14] [15] Это отличается для файлов EMF+, которые также используют ассоциативный массив через хэш-карту , которая записывает объект вместе с идентификатором объекта. Однако, в отличие от файлов WMF и EMF, которые могут удалять объект, когда создается новый объект с тем же индексом, что и существующий объект, запись в таблице заменяется новым объектом. Файлу EMF также не нужно специально выбирать объект перед его использованием. [16]
Расширение имени файла | .wmf |
---|---|
Тип интернет-СМИ | изображение/wmf [10] |
Единый идентификатор типа (UTI) | com.microsoft.wmf [10] |
Тип формата | Векторная графика |
Расширено до | ЭМП |
Файлы WMF изначально не были разработаны как независимые от устройств, то есть файл не мог быть воспроизведен на устройствах вывода, которые отличались от исходного устройства, на котором был записан файл. Частичное решение этой проблемы было изобретено Aldus Corporation , которая добавила дополнительный «размещаемый» заголовок, называемый «заголовком APM», [18] , который добавлял ограничивающий прямоугольник, версию метафайла, размер метафайла, количество объектов в метафайле и размер самой большой отдельной записи в метафайле. [19] [20] Позднее это было включено в формат WMF компанией Microsoft , начиная с Windows 2000. [ 21]
Файлы WMF структурированы серией записей, начиная с нескольких контрольных записей: записи заголовка, [19] [22] вышеупомянутой необязательной размещаемой записи, [23] и заканчивая записью конца файла . [19] [24]
Инкапсулированные в контрольные записи записи составляют само изображение. Эти записи работают в рамках того, что известно как контекст устройства воспроизведения , который представляет собой набор свойств и объектов, составляющих графическую среду устройства, когда метафайл «воспроизводится» на этом устройстве вывода. [25]
Записи, не являющиеся контрольными, можно в основном сгруппировать в записи растровых изображений, записи чертежей, записи объектов, записи состояний и записи escape-сигналов.
Записи растровых изображений управляют и выводят растровые изображения .
Имя | Описание |
---|---|
META_BITBLT | Указывает, как выполнить передачу битового блока . Эти записи могут указывать битовую карту для использования в качестве источника или региона. [26] |
META_DIBBITBLT | Указывает, как сделать передачу битового блока независимого от устройства растрового изображения. Эти записи могут указывать растровое изображение для использования в качестве источника или региона. [27] |
META_DIBSTRETCHBITBLT | Указывает, как сделать передачу битового блока независимого от устройства растрового изображения, но допускает расширение или сжатие изображения. Эти записи могут указывать растровое изображение для использования в качестве источника или региона. [28] |
META_SETDIBTODEV | Указывает цвет для установки блока пикселей в независимом от устройства растровом изображении. Эти записи могут указывать растровое изображение для использования в качестве источника или региона. [29] |
META_STRETCHBLT | Указывает, как выполнить передачу битового блока, но допускает расширение или сжатие изображения. [30] |
META_STRETCHDIB | Указывает, как сделать передачу битового блока независимого от устройства растрового изображения, но допускает расширение или сжатие изображения. Эти записи могут указывать растровое изображение для использования в качестве источника или региона. [31] |
Записи чертежей создают графический вывод.
Имя | Описание |
---|---|
МЕТА_АРК | Рисует эллиптическую дугу . [32] |
META_CHORD | Рисует аккорд . [33] |
META_ELLIPSE | Рисует эллиптическую дугу . [34] |
META_EXTFLOODFILL | Заполняет область кистью. [35] |
META_EXTTEXTOUT | Нарисуйте текст с использованием шрифта, цвета фона и цвета текста контекста устройства воспроизведения. [36] |
META_FILLREGION | Заполняет область указанной кистью. [37] |
META_FLOODFILL | Заполняет область кистью. [38] |
META_FRAMEREGION | Рисует границу вокруг области страницы с помощью кисти. [39] |
META_INVERTREGION | Закрашивает область графики инвертированными цветами. [40] |
META_LINETO | Рисует полуоткрытую линию от позиции рисования, определенной в контексте устройства воспроизведения, до указанной точки. [41] |
META_PAINTREGION | Закрасить область текущей кистью, указанной в контексте устройства воспроизведения. [42] |
META_PATBLT | Закрасьте область текущей кистью, указанной в контексте устройства воспроизведения, а затем объедините цвет кисти и цвет(а) поверхности с помощью растровой операции . [43] |
META_PIE | Нарисуйте сектор в форме круга, ограниченный пересечением эллипса и двух радиалов — линия задается пером, заданным через контекст устройства воспроизведения, а область, ограниченная сектором, заполняется текущей кистью контекста устройства воспроизведения. [44] |
META_POLYLINE | Рисует ряд отрезков линий, соединяя точки в указанном массиве. [45] |
МЕТА_ПОЛИГОН | Рисует многоугольник, состоящий из двух или более вершин, соединенных прямыми линиями. Многоугольник очерчивается с помощью пера и заполняется с помощью кисти и режима заливки многоугольника, которые определяются в контексте устройства воспроизведения. [46] |
META_POLYPOLYGON | Рисует ряд замкнутых многоугольников, которые могут перекрываться. Каждый многоугольник очерчивается с помощью пера и заполняется с помощью кисти и режима заливки многоугольника, которые определяются в контексте устройства воспроизведения. [47] |
МЕТА_ПРЯМОУГОЛЬНИК | Рисует прямоугольник, который очерчивается с помощью пера и заполняется с помощью кисти, которая заполняется с помощью кисти, определенной в контексте устройства воспроизведения. [48] |
META_ROUNDRECT | Рисует прямоугольник со скругленными углами. Прямоугольник очерчивается с помощью пера и заполняется с помощью кисти, которая заполняется с помощью кисти, которая определена в контексте устройства воспроизведения. [49] |
META_SETPIXEL | Устанавливает пикселю в указанных координатах указанный цвет. [50] |
META_TEXTOUT | Выводит строку символов в указанном месте, используя шрифт, цвет фона и цвет текста, которые определены в контексте устройства воспроизведения. [51] |
Записи объектов создают и управляют графическими объектами. В файлах WMF есть две широкие категории объектов — графические объекты и структурные объекты. Структурные объекты явно не создаются и не удаляются в WMF, вместо этого они являются сложными структурами. Например, BitmapCoreHeader содержит информацию о размерах и цветовом формате аппаратно-независимого растрового изображения, [52] которое само по себе является частью объекта DeviceIndependentBitmap. [53] Графический объект, однако, определяет параметры для графического вывода и во время воспроизведения WMF устанавливает контекст устройства воспроизведения. [54]
Графическими объектами могут быть кисти (определяют стиль, цвет и узор кисти, который определяет, как закрашивать область графики), шрифты (определяют свойства, которые влияют на то, как отображается текст), палитры (определяют цвета как независимые от устройства значения, определяемые приложением), перья (определяют графические атрибуты линии) и области (определяют сегменты линий и кривых, которые определяют форму). [54]
Имя | Описание |
---|---|
META_CREATEBRUSHINDIRECT | Создает объект кисти из объекта LogBrush (логическая кисть). [55] |
META_CREATEFONTINDIRECT | Создает объект кисти из объекта шрифта. [56] |
META_CREATEPALETTE | Создает объект палитры. |
META_CREATEPATTERNBRUSH [57] | Создает объект кисти из объекта LogBrush (логическая кисть). [58] |
META_CREATEPENINDIRECT | Создает объект пера. [59] |
META_CREATEREGION | Создает объект региона. [60] |
META_DELETEOBJECT | Удалить объект. [61] |
META_CREATEBRUSHINDIRECT | Создает объект кисти из объекта LogBrush (логическая кисть). [62] |
META_DIBCREATEPATTERNBRUSH | Создает объект кисти из независимого от устройства растрового изображения. [63] |
META_SELECTCLIPREGION | Указывает объект региона, который будет текущей областью отсечения . [64] |
META_SELECTOBJECT | Выбирает объект, который будет текущим объектом для контекста устройства воспроизведения, что работает со всеми графическими объектами, за исключением объектов палитры, которые должны быть установлены с помощью META_SELECTPALETTE. [65] |
META_SELECTPALETTE | Выбирает логическую палитру для контекста устройства воспроизведения. [66] |
Записи состояний управляют графическими свойствами контекста устройства воспроизведения. [67]
Имя | Описание |
---|---|
META_ANIMATEPALETTE | Переопределяет записи в логической палитре, которая определена в контексте устройства воспроизведения с указанным объектом палитры. [68] |
META_EXCLUDECLIPRECT | Устанавливает область отсечения, определенную в контексте устройства воспроизведения, на существующую область отсечения за вычетом указанного прямоугольника. [69] |
META_INTERSECTCLIPRECT | Устанавливает область отсечения, которая определена в контексте устройства воспроизведения, на пересечение существующей области отсечения и указанного прямоугольника. [70] |
META_MOVETO | Устанавливает позицию вывода в контексте устройства воспроизведения в указанную точку. [71] |
META_OFFSETCLIPRGN | Перемещает область отсечения, определенную в контексте устройства воспроизведения, с помощью указанных смещений. [72] |
META_OFFSETVIEWPORTORG | Перемещает начало области просмотра в контексте устройства воспроизведения на указанные горизонтальные и вертикальные смещения. [73] |
META_OFFSETWINDOWORG | Перемещает начало окна вывода в контексте устройства воспроизведения на указанные горизонтальные и вертикальные смещения. [74] |
META_REALIZEPALETTE | Сопоставляет записи из логической палитры, которая определена в контексте устройства воспроизведения, с системной палитрой. [75] |
META_RESIZEPALETTE | Переопределяет размер логической палитры, которая определена в контексте устройства воспроизведения. [76] |
META_RESTOREDC | Восстанавливает контекст устройства воспроизведения из ранее сохраненного контекста устройства. [77] |
META_SAVEDC | Сохраняет контекст устройства воспроизведения для последующего извлечения. [78] |
META_SCALEVIEWPORTEXT | Масштабирует горизонтальные и вертикальные размеры области просмотра, которая определена в контексте устройства воспроизведения, используя соотношения, образованные указанными множителями и делителями. [79] |
META_SCALEWINDOWEXT | Масштабирует горизонтальные и вертикальные размеры выходного окна, определенного в контексте устройства воспроизведения, используя соотношения, образованные указанными множителями и делителями. [80] |
META_SETBKCOLOR | Устанавливает цвет фона в контексте устройства воспроизведения на указанный цвет. [81] |
META_SETBKMODE | Устанавливает режим фонового микширования в контексте устройства воспроизведения. [82] |
META_SETLAYOUT | Определяет ориентацию макета в контексте устройства воспроизведения. [83] |
META_SETMAPMODE | Определяет режим отображения в контексте устройства воспроизведения. [84] |
META_SETMAPPERFLAGS | Определяет алгоритм, который использует преобразователь шрифтов при преобразовании логических шрифтов в физические шрифты. [85] |
META_SETPALENTRIES | Определяет значения цвета RGB в диапазоне записей в логической палитре, которая определена в контексте устройства воспроизведения. [86] |
META_SETPOLYFILLMODE | Определяет режим заполнения полигонов в контексте устройства воспроизведения для графических операций, заполняющих полигоны. [87] |
META_SETRELABS | Неиспользованная запись. [88] |
META_SETROP2 | Определяет режим смешивания растровых операций переднего плана в контексте устройства воспроизведения. [89] |
META_SETSTRETCHBLTMODE | Определяет режим растяжения растрового изображения в контексте устройства воспроизведения. [90] |
META_SETTEXTALIGN | Определяет значения выравнивания текста в контексте устройства воспроизведения. [91] |
META_SETTEXTCHAREXTRA | Определяет межсимвольный интервал для выравнивания текста в контексте устройства воспроизведения. [92] |
META_SETTEXTCOLOR | Определяет цвет переднего плана текста в контексте устройства воспроизведения. [93] |
META_SETTEXTJUSTIFICATION | Определяет количество пробелов, добавляемых для разрыва символов в строке выровненного текста. [94] |
META_SETVIEWPORTEXT | Определяет горизонтальные и вертикальные размеры области просмотра в контексте устройства воспроизведения. [95] |
META_SETVIEWPORTORG | Определяет начало области просмотра в контексте устройства воспроизведения. [96] |
META_SETWINDOWEXT | Определяет горизонтальные и вертикальные размеры окна вывода в контексте устройства воспроизведения. [97] |
META_SETWINDOWORG | Определяет начало окна вывода в контексте устройства воспроизведения. [98] |
Escape-записи — это средства расширения функциональности метафайла с помощью записей, которые иначе не определяются как тип записи WMF. Каждая escape-запись содержит функцию записи, escape-функцию и потенциально escape-данные.
Следующие записи побега составляют файл WMF.
Имя | Описание |
---|---|
ABORTDOC | Останавливает обработку текущего документа. [99] |
BEGIN_PATH | Открывает путь. [100] |
CHECK_JPEGFORMAT | Определяет, может ли он обработать данное изображение JPEG . [101] |
CHECK_PNGFORMAT | Определяет, может ли он обработать данное изображение PNG . [102] |
CLIP_TO_PATH | Применяет функцию к текущему контуру обрезки PostScript . [103] |
ЗАКРЫТЬ_КАНАЛ | То же, что и ENDDOC. [104] |
СКАЧАТЬ_ЛИЦО | Устанавливает имя шрифта на устройстве вывода. [105] |
ЗАГРУЗКА_ЗАГОЛОВКА | Загружает наборы процедур PostScript. [106] |
DRAW_PATTERNRECT | Рисует прямоугольник с заданным узором. [107] |
ENCAPSULATED_POSTSCRIPT | Отправляет произвольные инкапсулированные данные PostScript (EPS) непосредственно драйверу принтера. [108] |
КОНЕЦ_ПУТИ | Завершает путь. [109] |
ENDDOC | Уведомляет драйвер принтера о завершении нового задания печати. [110] |
EPS_ПЕЧАТЬ | Указывает начало и конец печати EPS. [111] |
EXTTEXTOUT | Рисует текст, используя текущий выбранный шрифт, цвет фона и цвет текста. [112] |
GET_COLORTABLE | Получает значения таблицы цветов из драйвера принтера. [113] |
GET_DEVICEUNITS | Получает единицы устройства, настроенные в данный момент на выходном устройстве. [114] |
GET_EXTENDED_TEXTMETRICS | Получает расширенные текстовые метрики, которые в данный момент настроены на драйвере принтера. [115] |
GET_FACENAME | Получает имя шрифта, настроенного в данный момент на устройстве вывода. [116] |
GET_PAIRKERNTABLE | Получает таблицу кернинга шрифта , определенную в данный момент на устройстве вывода. [117] |
GET_PHYSPAGESIZE | Извлекает физический размер страницы, выбранный в данный момент на устройстве вывода. [118] |
GET_PRINTINGOFFSET | Извлекает смещение от верхнего левого угла физической страницы, где начинается фактическая печать или рисунок. [119] |
GET_PS_FEATURESETTING | Запрашивает у драйвера принтера информацию о функциях PostScript, поддерживаемых на устройстве вывода. [120] |
GET_SCALINGFACTOR | Извлекает коэффициенты масштабирования для осей x и y принтера. [121] |
META_ESCAPE_ENHANCED_METAFILE | Используется для встраивания метафайла EMF в метафайл WMF. [122] |
METAFILE_DRIVER | Запрашивает драйвер принтера о поддержке метафайлов на устройстве вывода. [123] |
НОВЫЙКАДР | Уведомляет драйвер принтера о том, что приложение завершило запись на страницу. [124] |
NEXTBAND | Уведомляет драйвер принтера о том, что приложение завершило запись в полосу. [125] |
СКВОЗНОЙ | Передает произвольные данные в драйвер принтера. [126] |
POSTSCRIPT_DATA | Отправляет произвольные данные PostScript на выходное устройство. [127] |
POSTSCRIPT_IDENTIFY | Устанавливает драйвер принтера в режим PostScript-centric или GDI-centric. [128] |
POSTSCRIPT_IGNORE | Уведомляет выходное устройство о необходимости игнорировать данные PostScript. [129] |
ПОСТСКРИПТ_ИНЪЕКЦИЯ | Вставляет блок необработанных данных в поток PostScript. [130] |
POSTSCRIPT_PASSTHROUGH | Отправляет произвольные данные непосредственно в драйвер принтера, который, как ожидается, будет обрабатывать эти данные только в режиме PostScript. [131] |
ОТКРЫТЫЙ_КАНАЛ | Действует так же, как STARTDOC, с документом NULL и именем выходного файла, а также данными в необработанном режиме. [132] |
QUERY_DIBSUPPORT | Запрашивает драйвер принтера о поддержке DIB на устройстве вывода. [133] |
QUERY_ESCSUPPORT | Запрашивает драйвер принтера, чтобы определить, поддерживается ли конкретная функция экранирования WMF на устройстве вывода. [134] |
SET_COLORTABLE | Устанавливает значения цветовой таблицы. [135] |
SET_COPYCOUNT | Устанавливает количество копий. [136] |
SET_LINECAP | Указывает режим завершения строки, используемый при рисовании на устройстве вывода. [137] |
SET_LINEJOIN | Указывает режим соединения линий, используемый при рисовании на устройстве вывода. [138] |
SET_MITERLIMIT | Устанавливает ограничение на длину угловых соединений, используемых при рисовании на устройстве вывода. [139] |
SPCLPASSTHROUGH2 | Позволяет включать в документы частные процедуры и другие произвольные данные. [140] |
STARTDOC | Уведомляет драйвер принтера о начале нового задания печати. [141] |
Была обнаружена серьезная уязвимость в записях escape вокруг записи Abort escape, которая хранит код процедуры прерывания внутри самой записи. Это затронуло системы Windows (см. CVE - 2005-4560) и проект Wine (см. CVE - 2006-0106). По словам Secunia , «уязвимость вызвана из-за ошибки в обработке файлов метафайлов Windows ('.wmf'), содержащих специально созданные записи SETABORTPROC 'Escape'. Такие записи позволяют выполнять произвольную пользовательскую функцию при сбое рендеринга файла WMF». [142] Согласно документации Windows 3.1 SDK, функция SETABORTPROC escape устарела и была заменена функцией с тем же именем в Windows 3.1 задолго до обнаружения уязвимости WMF. [143] Однако устаревший код escape был сохранен для совместимости с 16-битными программами, написанными для (или, по крайней мере, обратно совместимыми) Windows 3.0. Это изменение произошло примерно в то же время, когда Microsoft создавала 32-битную версию GDI для Windows NT, и вполне вероятно, что уязвимость возникла во время этих усилий.
После того, как Стив Гибсон обвинил Microsoft в преднамеренном внедрении бэкдора в свой код, [144] [145] Марк Руссинович выступил с опровержением и заявил, что:
...все было по-другому, когда формат был спроектирован. В Windows 3.1 «большая» модель памяти код изначально независим от местоположения, и Windows никогда не была исправлена, поэтому и Windows, и приложение могли просто скопировать функцию приложения в файл WMF и предположить, что она будет работать при воспроизведении тем же приложением в более позднем сеансе запуска. В любом случае, не ясно, предполагали ли разработчики, что приложения будут создавать метафайлы на диске с процедурами отмены. Кроме того, как указал Стивен Тулуз из Microsoft в опровержении Microsoft заявлений Стива, ландшафт безопасности в начале 1990-х годов сильно отличался от сегодняшнего, и весь код, включая тот, что хранился в файле WMF, изначально был доверенным. [146]
Питер Ферри из Symantec Security Response, США также не согласился с Гибсоном, отметив, что:
Гибсон утверждал, что поток создается для запуска обработчика SetAbortProc. На самом деле, для запуска обработчика не создается никакого потока — это обратный вызов, который вызывается парсером, и парсер должен ждать, пока обратный вызов не вернется, иначе весь смысл функции (прервать печать) теряется. По его собственному признанию, Гибсон не читал документацию (на самом деле, он утверждал, что не смог ее найти, хотя она свободно доступна на веб-сайте Microsoft), и он утверждал, что контекст устройства недоступен обработчику функции. Конечно, контекст устройства доступен обработчику функции — это один из двух параметров, которые ему передаются (см. выше), и он требуется для того, чтобы прервать печать. Наконец, Гибсон утверждал, что поток управления не может вернуться в Windows. Это просто вопрос возврата и отбрасывания функцией параметров, которые были переданы в стеке. Если запись правильно сформирована, Windows продолжит анализировать файл, как и раньше. ... Гибсон признает, что он догадывался о многих вещах. К сожалению, он догадывался плохо. Думаю, теперь мы знаем лучше. [147]
Расширение имени файла | .ЭДС |
---|---|
Тип интернет-СМИ | изображение/ЭДС [10] |
Единый идентификатор типа (UTI) | com.microsoft.emf [10] |
Тип формата | Векторная графика |
Расширенный от | ВМФ |
Расширено до | ЭМП+ |
Файлы EMF имеют три возможных версии заголовков. Исходный заголовок — это просто контейнер для изображений, вторая и третья версии инкапсулируют исходный заголовок и содержат запись формата пикселей и поддержку записей OpenGL, а третья версия инкапсулирует второе расширение заголовка и повышает точность EMF и масштабируемость EMF, поскольку добавляет возможность измерять расстояния поверхностей устройств с использованием метрической системы. [148]
Каждый заголовок EMF начинается с записи EMR_HEADER и записывает соответствующие свойства устройства, на котором было записано изображение метафайла. Исходный заголовок EMF имеет заголовок размером 80 байт и необязательную строку описания переменной длины. [149] Другие метафайлы содержат поля расширения, которые инкапсулируют исходный заголовок. EmfMetafileHeaderExtension1
— это запись, которая вставляется непосредственно после исходного заголовка EMF, указывает, есть ли дескриптор формата пикселя и смещение объекта дескриптора в заголовке, а также поле, которое указывает, существуют ли записи OpenGL в метафайле. [150] Дескриптор формата пикселя указывает возможности поверхности рисования и кодируется ли пиксель в RGBA или является индексом в таблице цветов. [151] EmfMetafileHeaderExtension2
— это запись, которая вставляется непосредственно после EmfMetafileHeaderExtension1
записи и содержит два поля со значениями X и Y для измерения поверхности устройства в микрометрах. [152]
Как и файлы WMF, записи можно классифицировать по функции, однако в файлах EMF больше типов записей, чем в файлах WMF. Записи можно классифицировать как записи управления, битовой карты, обрезки, комментария, рисования, экранирования, создания объектов, манипуляции объектами, OpenGL, скобки пути, состояния и преобразования.
С выпуском Windows XP был представлен формат Enhanced Metafile Format Plus Extensions (EMF+). EMF+ предоставляет способ сериализации вызовов API GDI+ таким же образом, как WMF/EMF хранит вызовы GDI.
Существуют также сжатые версии метафайлов Windows, известные как сжатый метафайл Windows (WMZ) и сжатый расширенный метафайл Windows (EMZ) [153] , которые по сути представляют собой сжатые с помощью gzip файлы WMF и EMF соответственно.
Формат WMF был разработан для выполнения слоем Windows GDI с целью восстановления изображения , но поскольку двоичные файлы WMF содержат определение графических примитивов GDI, составляющих это изображение, можно разработать альтернативные библиотеки, которые визуализируют двоичные файлы WMF или преобразуют их в другие графические форматы.
Эти опкоды не реализованы, по той причине, что я не знаю, что они из себя представляют, нет известной документации
<55> Раздел 2.3.2.3: Windows NT 3.1, Windows NT 3.5, Windows NT 3.51 и Windows 95: эта функция не поддерживается.