Введение

Формат файла для изображений. Windows Metafile (WMF) — это формат файла изображения, изначально разработанный для Microsoft Windows в 1990-х годах. Оригинальный формат Windows Metafile не был независим от устройства (хотя его можно было сделать более независимым с помощью заголовков размещения) и может содержать как векторную графику, так и растровые компоненты. Он функционирует аналогично файлам SVG. Позднее файлы WMF были заменены Enhanced Metafiles (EMF-файлами), которые обеспечивали независимость от устройства. Файлы EMF, в свою очередь, были усовершенствованы посредством файлов EMF+. По сути, метафайл хранит список записей, состоящих из команд рисования, определений свойств и графических объектов для отображения изображения на экране. Используемые команды рисования тесно связаны с командами графического интерфейса устройств (GDI) API, используемого для рисования в Microsoft Windows. Существует три основных типа метафайлов — WMF представляет собой 16-битовый формат, представленный в Windows 3.0. Это собственный векторный формат для приложений Microsoft Office, таких как Word, PowerPoint и Publisher. По состоянию на 2023 год доступна 17-я редакция спецификации формата Windows Metafile. Файлы EMF, которые заменили файлы WMF, работают по тому же принципу, но это 32-битный формат файла, который также позволяет встраивать пользовательские данные в записи «комментариев». EMF+ является расширением файлов EMF и встраивается в эти записи комментариев, позволяя использовать изображения и текст с командами, объектами и свойствами, аналогичными Windows GDI+.

История

Первоначальный 16-битовый формат файла WMF был полностью описан в томе 4 документации Windows 3.1 SDK 1992 года (по крайней мере, в сочетании с описаниями отдельных функций и структур в других томах), но эта спецификация была нечеткой в некоторых деталях. Эти руководства были опубликованы в виде печатных книг, доступных в книжных магазинах, без соглашения EULA с подтверждением принятия условий или других необычных лицензионных ограничений (только общее предупреждение о том, что при покупке в составе программного пакета, программное обеспечение будет регулироваться условиями этого пакета). Со временем существование этой исторической спецификации было в значительной степени забыто, и некоторые альтернативные реализации прибегали к реверс-инжинирингу, чтобы определить формат файла на основе существующих файлов WMF, что было сложно и чревато ошибками. В сентябре 2006 года Microsoft вновь опубликовала спецификацию формата файлов WMF в более полной форме в рамках Microsoft Open Specification Promise, обещая не заявлять о патентных правах в отношении разработчиков, реализующих этот формат. Позже Microsoft отказалась от файлов WMF в пользу 32-битовых файлов EMF, поскольку файлы WMF имели серьезные проблемы с независимости от устройства, несмотря на использование "размещаемого" заголовка файла, обеспечивающего базовую независимость. Microsoft обнаружила, что разработчики, использующие этот формат, "[встраивали] в метафайлы комментарии о приложении, местоположении или масштабировании. Другие добавляли заголовки в метафайл, содержащие различную информацию, специфичную для приложения", что приводило к серьезным проблемам совместимости. Таким образом, в 1992 году с Windows NT 3.1 Microsoft представила формат Enhanced Metafile (EMF) — формат, основанный на Win32 API, в котором была встроена независимость от устройства. С выпуском Windows XP и GDI+ набор записей необходимо было значительно расширить, и поэтому Microsoft выпустила EMF+ как расширение существующего формата файла EMF.

Структура метафайла

Файлы WMF, EMF и EMF+ состоят из последовательности записей, которые воспроизводятся для генерации графического вывода. Некоторые записи определяют объекты, которые могут задавать графические примитивы, используемые для определения способа отрисовки графики (например, перья задают цвет и толщину линий). Все эти объекты хранятся в метафайлах и помещаются в таблицу объектов, которая отслеживает использование графических примитивов в процессе обработки метафайла. Таблица объектов представляет собой ассоциативный массив индексов к структурам графических примитивов, определенным в метафайле. Файлы WMF и EMF обрабатывают объекты иначе, чем записи EMF+ в файлах EMF. По мере обработки файла WMF или EMF записи помещаются в таблицу объектов после определения объекта. Если объект удаляется, он освобождается из таблицы, и идентификатор может быть использован повторно. Важно отметить, что объект не будет использован, пока он не будет явно выбран во время воспроизведения записи. Это отличается от файлов EMF+, которые также используют ассоциативный массив посредством хеш-таблицы, сохраняющей объект вместе с его идентификатором. Однако, в отличие от файлов WMF и EMF, которые могут удалять объекты, при создании нового объекта с тем же индексом, что и у существующего, запись в таблице заменяется новым объектом. Файл EMF также не требует явного выбора объекта перед его использованием.

Записи битмапов

Записи растровых изображений управляют и выводят растровые изображения. Описание имени META BITBLT Определяет способ выполнения передачи блоков битов. Эти записи могут указывать растровое изображение, используемое в качестве источника, или область. META DIBBITBLT Определяет способ выполнения передачи блоков битов изображения, независимого от устройства. Эти записи могут указывать растровое изображение, используемое в качестве источника, или область. META DIBSTRETCHBITBLT Определяет способ выполнения передачи блоков битов изображения, независимого от устройства, но допускает растяжение или сжатие изображения. Эти записи могут указывать растровое изображение, используемое в качестве источника, или область. META SETDIBTODEV Определяет цвет для установки блока пикселей в изображении, независимом от устройства. Эти записи могут указывать растровое изображение, используемое в качестве источника, или область. META STRETCHBLT Определяет способ выполнения передачи блоков битов, но позволяет растягивать или сжимать изображение. META STRETCHDIB Определяет способ выполнения передачи блоков битов изображения, независимого от устройства, но позволяет растягивать или сжимать изображение. Эти записи могут указывать растровое изображение, используемое в качестве источника, или область.

Записи о снятии

Записи рисования генерируют графический вывод. Название Описание META ARC Рисует эллиптическую дугу. META CHORD Рисует хорду. META ELLIPSE Рисует эллиптическую дугу. META EXTFLOODFILL Заполняет область кистью. META EXTTEXTOUT Выводит текст с использованием шрифта, цвета фона и цвета текста контекста устройства воспроизведения. META FILLREGION Заполняет область указанной кистью. META FLOODFILL Заполняет область кистью. META FRAMEREGION Рисует границу вокруг области страницы кистью. META INVERTREGION Инвертирует цвета области графики. META LINETO Рисует полуоткрытую линию от позиции рисования, определенной в контексте устройства воспроизведения, до указанной точки. META PAINTREGION Закрашивает область текущей кистью, указанной в контексте устройства воспроизведения. META PATBLT Закрашивает область текущей кистью, указанной в контексте устройства воспроизведения, а затем объединяет цвет кисти и цвет поверхности с помощью растровой операции. META PIE Рисует сектор круга, ограниченный пересечением эллипса и двух радиалов — линия задается пером, установленным через контекст устройства воспроизведения, а область, ограниченная формой сектора, заполняется текущей кистью контекста устройства воспроизведения. META POLYLINE Рисует серию линейных сегментов, соединяя точки в заданном массиве. META POLYGON Рисует многоугольник, состоящий из двух или более вершин, соединенных прямыми линиями. Многоугольник обводится пером и заполняется кистью и режимом заполнения многоугольника, определенными в контексте устройства воспроизведения. META POLYPOLYGON Рисует серию закрытых многоугольников, которые могут перекрываться. Каждый многоугольник обводится пером и заполняется кистью и режимом заполнения многоугольника, определенными в контексте устройства воспроизведения. META RECTANGLE Рисует прямоугольник, который обводится пером и заполняется кистью, определенной в контексте устройства воспроизведения. META ROUNDRECT Рисует прямоугольник с закругленными углами. Прямоугольник обводится пером и заполняется кистью, определенной в контексте устройства воспроизведения. META SETPIXEL Устанавливает цвет пикселя в указанных координатах в указанный цвет. META TEXTOUT Выводит строку символов в указанном месте, используя шрифт, цвет фона и цвет текста, определенные в контексте устройства воспроизведения.

Государственные записи

Государственные записи управляют графическими свойствами контекста устройства воспроизведения. Название Описание META ANIMATEPALETTE Переопределяет записи в логической палитре, определенной в контексте устройства воспроизведения, с помощью указанного объекта палитры. META EXCLUDECLIPRECT Устанавливает область отсечения, определенную в контексте устройства воспроизведения, равной существующей области отсечения минус указанный прямоугольник. META INTERSECTCLIPRECT Устанавливает область отсечения, определенную в контексте устройства воспроизведения, равной пересечению существующей области отсечения и указанного прямоугольника. META MOVETO Устанавливает выходную позицию в контексте устройства воспроизведения в указанную точку. META OFFSETCLIPRGN Перемещает область отсечения, определенную в контексте устройства воспроизведения, на указанные смещения. META OFFSETVIEWPORTORG Перемещает начало координат окна просмотра в контексте устройства воспроизведения на указанные горизонтальные и вертикальные смещения. META OFFSETWINDOWORG Перемещает начало координат выходного окна в контексте устройства воспроизведения на указанные горизонтальные и вертикальные смещения. META REALIZEPALETTE Отображает записи из логической палитры, определенной в контексте устройства воспроизведения, в системную палитру. META RESIZEPALETTE Переопределяет размер логической палитры, определенной в контексте устройства воспроизведения. META RESTOREDC Восстанавливает контекст устройства воспроизведения из ранее сохраненного контекста устройства. META SAVEDC Сохраняет контекст устройства воспроизведения для последующего восстановления. META SCALEVIEWPORTEXT Масштабирует горизонтальные и вертикальные размеры окна просмотра, определенного в контексте устройства воспроизведения, используя отношения, образованные указанными множителями и делителями. META SCALEWINDOWEXT Масштабирует горизонтальные и вертикальные размеры выходного окна, определенного в контексте устройства воспроизведения, используя отношения, образованные указанными множителями и делителями. META SETBKCOLOR Устанавливает цвет фона в контексте устройства воспроизведения в указанный цвет. META SETBKMODE Устанавливает режим смешивания фона в контексте устройства воспроизведения. META SETLAYOUT Определяет ориентацию макета в контексте устройства воспроизведения. META SETMAPMODE Определяет режим сопоставления в контексте устройства воспроизведения. META SETMAPPERFLAGS Определяет алгоритм, используемый сопоставителем шрифтов при сопоставлении логических шрифтов с физическими шрифтами. META SETPALENTRIES Определяет значения RGB для диапазона записей в логической палитре, определенной в контексте устройства воспроизведения. META SETPOLYFILLMODE Определяет режим заполнения многоугольников в контексте устройства воспроизведения для графических операций, заполняющих многоугольники. META SETRELABS Неиспользуемая запись. META SETROP2 Определяет режим растровой операции на переднем плане в контексте устройства воспроизведения. META SETSTRETCHBLTMODE Определяет режим растяжения растрового изображения в контексте устройства воспроизведения. META SETTEXTALIGN Определяет значения выравнивания текста в контексте устройства воспроизведения. META SETTEXTCHAREXTRA Определяет межсимвольный интервал для выравнивания текста в контексте устройства воспроизведения. META SETTEXTCOLOR Определяет цвет текста на переднем плане в контексте устройства воспроизведения. META SETTEXTJUSTIFICATION Определяет количество пробелов, добавляемых для переноса символов в строке выровненного текста. META SETVIEWPORTEXT Определяет горизонтальные и вертикальные размеры окна просмотра в контексте устройства воспроизведения. META SETVIEWPORTORG Определяет начало координат окна просмотра в контексте устройства воспроизведения. META SETWINDOWEXT Определяет горизонтальные и вертикальные размеры выходного окна в контексте устройства воспроизведения. META SETWINDOWORG Определяет начало координат выходного окна в контексте устройства воспроизведения.

ЭМП+

С выпуском Windows XP был представлен формат Enhanced Metafile Format Plus Extensions (EMF+). EMF+ предоставляет способ сериализации вызовов API GDI+ аналогично тому, как WMF/EMF хранит вызовы GDI. Также существуют сжатые версии файлов Windows Metafile, известные как Compressed Windows Metafile (WMZ) и Compressed Windows Enhanced Metafile (EMZ), которые по сути являются файлами WMF и EMF, сжатыми с помощью gzip, соответственно.

Реализация

Формат WMF был разработан для воспроизведения слоем Windows GDI с целью восстановления изображения, однако поскольку бинарные файлы WMF содержат определения графических примитивов GDI, из которых состоит это изображение, возможно создание альтернативных библиотек, которые будут отображать бинарные файлы WMF или преобразовывать их в другие графические форматы.