Формат файла WMF — описание, как открыть?
Файлы формата WMF открываются специальными программами. Существует 2 типа форматов WMF, каждый из которых открывается разными программами. Чтобы открыть нужный тип формата, изучите описания файлов и скачайте одну из предложенных программ.
Чем открыть файл в формате WMF
Собственный формат графики Windows, разработанный компанией Microsoft. Содержит наборы чертежных операций, включая команды для черчения линий, окружностей и прямоугольников. Может также содержать операции черчения побитовой графики. Используется преимущественно для векторных изображений, но может такж включать в себя астровую графику.
Файлы WMF изначально появились в 1988 году с выпуском Windows 2.0. Позднее компания Microsoft выпустила спецификацию формата файла WMF с Windows 3.1 в 1992 году, а еще позже обновление в 2006 году.
Файлы WMF в основном были заменены стандартными форматами, такими как .JPG и .GIF. Формат WMF все еще поддерживается разными программами, включая Windows Photo Viewer от Microsoft, которая входит в состав Windows 7.
WMF Расширение файла
Собственный графический формат Windows, разработанный Microsoft; содержит последовательность операций рисования, включая команды для рисования линий, окружностей и прямоугольников; может также содержать растровые операции рисования; используется в основном для векторных изображений, но может также включать растровую графику.
Файлы WMF первоначально появились в 1988 году с выпуском Windows 2.0. Позже Microsoft опубликовала спецификацию формата файлов WMF с выпуском Windows 3.1 в 1992 году, а затем опубликовала последующую спецификацию в 2006 году.
Файлы WMF были в основном заменены более стандартными форматами, такими как .JPG и .GIF. картинки. Формат WMF по-прежнему поддерживается различными программами, в том числе Windows Photo Viewer от Microsoft, которая включена в Windows 7.
Метафайл Windows — Windows Metafile
Метафайл Windows ( WMF ) — это формат файла изображения, изначально разработанный для Microsoft Windows в 1990-х годах. Исходный формат метафайла Windows не был независимым от устройства (хотя его можно было сделать еще лучше с помощью заголовков размещения) и мог содержать компоненты как векторной графики, так и растровые . Он действует аналогично файлам SVG . Файлы WMF позже были заменены расширенными метафайлами (файлы EMF), которые действительно обеспечивали независимость от устройства. Затем файлы EMF были улучшены с помощью файлов EMF + .
По сути, метафайл хранит список записей, состоящий из команд рисования, определений свойств и графических объектов для отображения изображения на экране. Используемые команды рисования тесно связаны с командами API интерфейса графического устройства (GDI), используемыми для рисования в Microsoft Windows.
Существует три основных типа метафайлов — WMF — это 16-разрядный формат, представленный в Windows 3.0 . Это собственный векторный формат для приложений Microsoft Office, таких как Word , PowerPoint и Publisher . Начиная с 2017 г. 14 версия спецификации формата метафайлов Windows доступна для чтения в Интернете или для загрузки в формате PDF. Файлы 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 представила формат расширенного метафайла (EMF) — формат, основанный на API Win32 и обеспечивающий независимость от устройств. — они также были известны как метафайлы NT. С выпуском Windows XP и GDI + набор записей пришлось значительно увеличить, и поэтому Microsoft выпустила EMF + как расширение существующего формата файлов EMF.
Структура метафайла
Файлы WMF, EMF и EMF + состоят из серии записей, которые воспроизводятся для получения графического вывода. Некоторые записи определяют объекты, которые могут указывать графические объекты, используемые для определения способа рисования графики (например, перья определяют цвет и ширину линий). Каждый из этих объектов хранится в метафайлах и помещается в таблицу объектов, которая отслеживает использование графических объектов при обработке метафайла. Таблица объектов — это ассоциативный массив индексов структур графических объектов, определенных в метафайле.
Файлы WMF и EMF обрабатывают объектную обработку иначе, чем записи EMF + в файлах EMF. В процессе обработки файлов WMF и EMF записи считываются в таблицу объектов после определения объекта. Если объект удален, объект удаляется из таблицы, и идентификатор можно использовать повторно. Примечательно, что объект не будет использоваться, пока он не будет специально выбран во время воспроизведения записи. Это отличается от файлов EMF +, которые также используют ассоциативный массив через хэш-карту, которая записывает объект вместе с идентификатором объекта. Однако, в отличие от файлов WMF и EMF, которые могут удалять объект, когда создается новый объект, имеющий тот же индекс, что и существующий объект, запись в таблице заменяется новым объектом. EMF-файлу также не нужно специально выбирать объект перед его использованием.
Файлы WMF изначально не проектировались как независимые от устройств, что означает, что вы не могли воспроизводить файл на устройствах вывода, которые отличались от исходного устройства, на котором файл был записан. Частичное решение этой проблемы было изобретено корпорацией Aldus , которая добавила дополнительный «размещаемый» заголовок, названный «заголовком APM», который добавил ограничивающий прямоугольник, версию метафайла, размер метафайла, количество объектов в метафайле и размер. самой большой отдельной записи в метафайле. Позднее он был включен в формат WMF компанией Microsoft, начиная с Windows 2000.
Файлы WMF структурированы серией записей, начиная с нескольких контрольных записей: записи заголовка, вышеупомянутой необязательной размещаемой записи и заканчивая записью конца файла .
Контрольные записи инкапсулируют записи, составляющие само изображение. Эти записи работают в так называемом контексте устройства воспроизведения , который представляет собой набор свойств и объектов, составляющих графическую среду устройства, когда метафайл «воспроизводится» на этом устройстве вывода.
Записи, отличные от записей управления, могут быть в значительной степени сгруппированы в записи растровых изображений, записи чертежей, записи объектов, записи состояния и записи перехода.
Записи растровых изображений
Записи Bitmap управляют и выводят растровые изображения .
| Имя | Описание |
|---|---|
| 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_LINETO | Рисует полуоткрытую линию от позиции рисования, определенной в контексте устройства воспроизведения, до указанной точки. |
| META_PAINTREGION | Нарисуйте область текущей кистью, указанной в контексте устройства воспроизведения. |
| META_PATBLT | Нарисуйте область текущей кистью, указанной в контексте устройства воспроизведения, а затем объедините цвет кисти и цвет (а) поверхности с помощью растровой операции . |
| META_PIE | Нарисуйте клин в форме пирога, ограниченный пересечением эллипса и двух радиалов — линия задается пером, заданным через контекст устройства воспроизведения, а область, ограниченная формой пирога, заполняется текущей кистью устройства воспроизведения. контекст. |
| МЕТА_POLYLINE | Рисует серию сегментов линий, соединяя точки в указанном массиве. |
| МЕТА_ПОЛИГОН | Рисует многоугольник, состоящий из двух или более вершин, соединенных прямыми линиями. Многоугольник обводится пером и заполняется с помощью кисти и режима заливки многоугольника, которые определены в контексте устройства воспроизведения. |
| МЕТА_POLYPOLYGON | Рисует серию замкнутых многоугольников, которые могут перекрываться. Каждый многоугольник обводится пером и заполняется с помощью кисти и режима заливки многоугольника, которые определены в контексте устройства воспроизведения. |
| META_RECTANGLE | Закрашивает прямоугольник, очерченный пером, заполненный кистью и заполненный кистью, определенной в контексте устройства воспроизведения. |
| META_ROUNDRECT | Закрашивает прямоугольник со скругленными углами. Прямоугольник обводится пером, заполняется кистью и заполняется кистью, определенной в контексте устройства воспроизведения. |
| META_SETPIXEL | Устанавливает пиксель с указанными координатами на указанный цвет. |
| META_TEXTOUT | Выводит строку символов в указанном месте, используя шрифт, цвет фона и цвет текста, которые определены в контексте устройства воспроизведения. |
Записи об объектах
Записи объектов создают графические объекты и управляют ими. В файлах WMF есть две широкие категории объектов — графические объекты и объекты структуры. Объекты структуры не создаются и не удаляются в WMF явно, а вместо сложных структур. Например, BitmapCoreHeader содержит информацию о размерах и цветовом формате независимого от устройства растрового изображения, которое само является частью объекта DeviceIndependentBitmap. Графический объект, однако, определяет параметры для вывода графики, а во время воспроизведения WMF он устанавливает контекст устройства воспроизведения.
Графическими объектами могут быть кисти (определяет стиль, цвет и узор кисти, которые определяют, как рисовать область графики), шрифты (определяют свойства, которые влияют на отображение текста), палитры (задают цвета как значения, не зависящие от устройства, определяется приложением), перьями (задает графические атрибуты линии) и областями (которые определяют сегменты линии и кривой, определяющие форму).
| Имя | Описание |
|---|---|
| META_CREATEBRUSHINDIRECT | Создает объект кисти из объекта LogBrush (логическая кисть). |
| META_CREATEFONTINDIRECT | Создает объект кисти из объекта шрифта. |
| META_CREATEPALETTE | Создает объект палитры. |
| META_CREATEPATTERNBRUSH | Создает объект кисти из объекта LogBrush (логическая кисть). |
| META_CREATEPENINDIRECT | Создает объект пера. |
| META_CREATEREGION | Создает объект региона. |
| META_DELETEOBJECT | Удалить объект. |
| META_CREATEBRUSHINDIRECT | Создает объект кисти из объекта LogBrush (логическая кисть). |
| META_DIBCREATEPATTERNBRUSH | Создает объект кисти из независимого от устройства растрового изображения. |
| META_SELECTCLIPREGION | Определяет объект области, который будет текущей областью отсечения . |
| META_SELECTOBJECT | Выбирает объект, который будет текущим объектом для контекста устройства воспроизведения, который работает со всеми графическими объектами, кроме объектов палитры, которые должны быть установлены с помощью META_SELECTPALETTE. |
| META_SELECTPLAETTE | Выбирает логическую палитру для контекста устройства воспроизведения. |
Государственные записи
Записи состояния управляют графическими свойствами контекста устройства воспроизведения.
| Имя | Описание |
|---|---|
| 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 | Определяет источник окна вывода в контексте устройства воспроизведения. |
Записи о побегах
Escape-записи — это средство расширения функциональности метафайлов с помощью записей, которые иначе не определены как тип записи WMF. Каждая escape-запись содержит функцию записи, escape-функцию и потенциально escape-данные.
Следующие escape-записи составляют файл WMF.
| Имя | Описание |
|---|---|
| ABORTDOC | Останавливает обработку текущего документа. |
| BEGIN_PATH | Открывает путь. |
| CHECK_JPEGFORMAT | Определяет, может ли он обрабатывать данное изображение JPEG . |
| CHECK_PNGFORMAT | Определяет, может ли он обрабатывать данное изображение PNG . |
| CLIP_TO_PATH | Применяет функцию к текущему контуру обрезки PostScript . |
| CLOSE_CHANNEL | То же, что и ENDDOC. |
| DOWNLOAD_FACE | Устанавливает имя шрифта на устройстве вывода. |
| DOWNLOAD_HEADER | Загружает наборы процедур PostScript. |
| DRAW_PATTERNRECT | Рисует прямоугольник с заданным узором. |
| ENCAPSULATED_POSTSCRIPT | Отправляет произвольные инкапсулированные данные PostScript (EPS) непосредственно в драйвер принтера. |
| END_PATH | Заканчивает путь. |
| ENDDOC | Уведомляет драйвер принтера о завершении нового задания на печать. |
| EPS_PRINTING | Указывает начало и конец печати EPS. |
| EXTTEXTOUT | Рисует текст, используя текущий выбранный шрифт, цвет фона и цвет текста. |
| GET_COLORTABLE | Получает значения таблицы цветов из драйвера принтера. |
| GET_DEVICEUNITS | Получает единицы устройства, в настоящее время настроенные на устройстве вывода. |
| GET_EXTENDED_TEXTMETRICS | Получает расширенные текстовые метрики, которые в настоящее время настроены в драйвере принтера. |
| GET_FACENAME | Получает имя шрифта, настроенное в настоящее время на устройстве вывода. |
| GET_PAIRKERNTABLE | Получает таблицу ядра шрифтов, которая в настоящее время определена на устройстве вывода. |
| GET_PHYSPAGESIZE | Извлекает физический размер страницы, выбранный в данный момент на устройстве вывода. |
| GET_PRINTINGOFFSET | Извлекает смещение от верхнего левого угла физической страницы, где начинается фактическая печать или рисование. |
| GET_PS_FEATURESETTING | Запрашивает драйвер принтера для получения информации о функциях PostScript, поддерживаемых устройством вывода. |
| GET_SCALINGFACTOR | Извлекает коэффициенты масштабирования для оси x и оси y принтера. |
| META_ESCAPE_ENHANCED_METAFILE | Используется для встраивания метафайла EMF в метафайл WMF. |
| МЕТАФИЛЬ_ДРАЙВЕР | Запрашивает драйвер принтера о поддержке метафайлов на устройстве вывода. |
| NEWFRAME | Уведомляет драйвер принтера о том, что приложение завершило запись на страницу. |
| NEXTBAND | Уведомляет драйвер принтера о том, что приложение завершило запись в полосу. |
| ПРОЙТИ ЧЕРЕЗ | Передает произвольные данные драйверу принтера. |
| POSTSCRIPT_DATA | Отправляет произвольные данные PostScript на устройство вывода. |
| POSTSCRIPT_IDENTIFY | Устанавливает драйвер принтера в режим PostScript или GDI. |
| POSTSCRIPT_IGNORE | Сообщает устройству вывода игнорировать данные PostScript. |
| POSTSCRIPT_INJECTION | Вставляет блок необработанных данных в поток PostScript. |
| POSTSCRIPT_PASSTHROUGH | Отправляет произвольные данные непосредственно в драйвер принтера, который, как ожидается, будет обрабатывать эти данные только в режиме PostScript. |
| OPEN_CHANNEL | Действует так же, как STARTDOC, с документом NULL и выходным именем файла, а также данными в необработанном режиме. |
| QUERY_DIBSUPPORT | Запрашивает драйвер принтера о поддержке DIB на устройстве вывода. |
| QUERY_ESCSUPPORT | Запрашивает драйвер принтера, чтобы определить, поддерживается ли конкретная escape-функция WMF на устройстве вывода. |
| SET_COLORTABLE | Устанавливает значения таблицы цветов. |
| SET_COPYCOUNT | Устанавливает количество копий. |
| SET_LINECAP | Задает режим окончания строки для использования при выводе на устройство вывода. |
| SET_LINEJOIN | Задает режим соединения линий для использования при рисовании на устройстве вывода. |
| SET_MITERLIMIT | Устанавливает предел длины угловых соединений для использования в чертеже на устройстве вывода. |
| SPCLPASSTHROUGH2 | Позволяет документам включать частные процедуры и другие произвольные данные в документы. |
| STARTDOC | Уведомляет драйвер принтера о запуске нового задания на печать. |
Была обнаружена серьезная уязвимость в escape-записях вокруг escape-записи Abort, которая хранит код процедуры отмены внутри самой записи. Это затронуло системы Windows (см. CVE — 2005-4560 ) и проект Wine (см. CVE — 2006-0106 ). Согласно Secunia , «уязвимость вызвана ошибкой в обработке файлов метафайлов Windows (‘.wmf’), содержащих специально созданные записи SETABORTPROC ‘Escape’. Такие записи позволяют выполнять произвольные пользовательские функции при отображении файл WMF не работает «. Согласно документации SDK Windows 3.1, escape-код SETABORTPROC был устаревшим и заменен одноименной функцией в Windows 3.1, задолго до того, как была обнаружена уязвимость WMF. Однако устаревший escape-код был сохранен для совместимости с 16-битными программами, написанными для (или, по крайней мере, обратно совместимыми с) Windows 3.0. Это изменение произошло примерно в то же время, когда Microsoft создавала 32-битную повторную реализацию GDI для Windows NT, и вполне вероятно, что уязвимость возникла во время этой попытки.
После того, как Стив Гибсон обвинил Microsoft в преднамеренном внедрении бэкдора в свой код, Марк Руссинович представил опровержение и заявил, что:
. все было по-другому, когда создавался формат. В Windows 3.1 код модели «большой» памяти по своей сути не зависит от местоположения, и Windows никогда не обновлялась, поэтому и Windows, и приложение могли просто скопировать функцию приложения в файл WMF и предположить, что она будет работать при воспроизведении одним и тем же приложением в более поздний сеанс запуска. В любом случае неясно, предполагали ли разработчики приложения, создающие метафайлы на диске с процедурами прерывания. Кроме того, как Стивен Тулуза из Microsoft указал в опровержении заявлений Стива в Microsoft , ландшафт безопасности в начале 1990-х сильно отличался от сегодняшнего, и всему коду, включая тот, который хранится в файле WMF, по своей сути доверяли.
Питер Ферри из Symantec Security Response, США, также не согласен с Гибсоном, отметив, что:
Гибсон утверждал, что создается поток для запуска обработчика SetAbortProc. Фактически, никакой поток для запуска обработчика не создается — это обратный вызов, который вызывается парсером, и синтаксический анализатор должен ждать, пока обратный вызов не вернется, иначе весь смысл функции (для прерывания печати) теряется. . По его собственному признанию, Гибсон не читал документацию (на самом деле он утверждал, что не мог ее найти, хотя она находится в свободном доступе на веб-сайте Microsoft), и он утверждал, что контекст устройства недоступен для обработчика функций. . Конечно, контекст устройства доступен обработчику функции — это один из двух параметров, которые ему передаются (см. Выше), и он необходим для прерывания печати. Наконец, Гибсон заявил, что поток управления не может вернуться в Windows. Дело просто в том, что функция возвращает и отбрасывает параметры, которые были переданы в стек. Если запись сформирована правильно, Windows продолжит анализ файла, как и раньше. . Гибсон признается, что догадывался о нескольких вещах. К сожалению, он плохо угадал. Думаю, теперь мы знаем лучше.
Файлы EMF имеют три возможных версии заголовков. Исходные заголовки — это просто контейнер для изображений, вторая и третья версии инкапсулируют исходный заголовок и содержат запись формата пикселей и поддержку записей OpenGL, а третья версия инкапсулирует второе расширение заголовка и увеличивает точность EMF и масштабируемость EMF, поскольку это добавляет возможность измерения расстояний до поверхностей устройства в метрической системе.
Каждый заголовок EMF начинается с записи EMR_HEADER и записывает соответствующие свойства устройства, на котором было записано изображение метафайла. Исходный заголовок EMF имеет 80-байтовый заголовок и дополнительную строку описания переменной длины. Другие метафайлы содержат поля расширения, которые инкапсулируют исходный заголовок. EmfMetafileHeaderExtension1 — это запись, которая вставляется непосредственно после исходного заголовка EMF, указывает, есть ли дескриптор формата пикселей и смещение объекта дескриптора в заголовке, а также поле, которое указывает, существуют ли записи OpenGL в метафайле. Дескриптор формата пикселя определяет возможности поверхности рисования и то, закодирован ли пиксель в RGBA или является индексом в таблице цветов. EmfMetafileHeaderExtension2 — это запись, которая вставляется сразу после EmfMetafileHeaderExtension1 записи, и она содержит два поля со значениями X и Y для измерения поверхности устройства в микрометрах.
Как и файлы WMF, записи можно классифицировать по функциям, однако в файлах EMF больше типов записей, чем в файлах WMF. Записи могут быть классифицированы как элементы управления, растровые изображения, обрезки, комментарии, рисование, экранирование, создание объекта, манипулирование объектами, OpenGL, скобки пути, записи состояния и преобразования.
С выпуском Windows XP , в Enhanced Metafile Format Plus Extensions формат (EMF +) был введен. EMF + предоставляет способ сериализации вызовов API GDI + таким же образом, как WMF / EMF хранит вызовы GDI.
Существуют также сжатые версии метафайлов Windows, известные как сжатый метафайл Windows (WMZ) и сжатый расширенный метафайл Windows (EMZ), которые в основном представляют собой сжатые с помощью gzip файлы WMF и EMF соответственно.
Реализации
Формат WMF был разработан для выполнения слоем Windows GDI для восстановления изображения , но поскольку двоичные файлы WMF содержат определение графических примитивов GDI, составляющих это изображение, можно разработать альтернативные библиотеки, которые отображают двоичный файл WMF. файлы или конвертировать их в другие графические форматы.
Windows Metafile
WMF (англ. Windows MetaFile ) — универсальный формат векторных графических файлов для Windows приложений. Используется для хранения коллекции графических изображений Microsoft Clip Gallery. Формат разработан Microsoft и является неотъемлемой частью Windows, так как сохраняет последовательность аппаратно-независимых функций GDI (Graphical Device Interface), непосредственно выводящих изображение в заданный контекст графического устройства (на экран, на принтер и т.п.). Очень часто WMF неявно используется для сохранения образа окна вывода программы и его последующего восстановления, а также при переносе информации через буфер обмена (clipboard). Из MS Windows запись и чтение в файл этого формата осуществляются чрезвычайно просто и быстро. Файл этого формата может быть открыт с помощью кроссплатформенных программ GIMP (с предварительной растеризацией) и Inkscape. На платформе Macintosh аналогичную роль играет формат PICT.
Как формат векторной графики WMF в той или иной степени поддерживается многими мощными приложениями — AutoCAD, OpenOffice.org, и может использоваться для обмена данными между ними.
Структура файла
Файлы WMF и EMF состоят из списка записей, каждая из которых представляет собой определённую команду с набором аргументов. Форматы записей WMF и EMF похожи, однако есть следующие основные различия:
- В EMF добавились новые коды функций
- В EMF коды функций изменились по сравнению с WMF
- Аргументы, бывшие в WMF 16-битными, стали 32-битными в EMF
- В некоторых функциях в EMF добавились новые аргументы
Список типов записей WMF и EMF
| WMF-запись | Код WMF-записи | EMF-запись | Код EMF-записи | Описание |
|---|---|---|---|---|
| EMR_HEADER | 0x00000001 | Заголовок | ||
| EMR_POLYBEZIER | 0x00000002 | |||
| EMR_POLYBEZIER16 | 0x00000055 | |||
| META_POLYGON | 0x0324 | EMR_POLYGON | 0x00000003 | Нарисовать замкнутую ломаную линию |
| EMR_POLYGON16 | 0x00000056 | |||
| META_POLYLINE | 0x0325 | EMR_POLYLINE | 0x00000004 | |
| EMR_POLYLINE16 | 0x00000057 | |||
| EMR_POLYBEZIERTO | 0x00000005 | |||
| EMR_POLYBEZIERTO16 | 0x00000058 | |||
| META_POLYPOLYGON | 0x0538 | EMR_POLYPOLYGON | 0x00000008 | |
| EMR_POLYPOLYGON16 | 0x0000005B | |||
| META_SETWINDOWEXT | 0x020C | EMR_SETWINDOWEXTEX | 0x00000009 | Установить размеры окна (ширину и высоту) |
| META_SETWINDOWORG | 0x020B | EMR_SETWINDOWORGEX | 0x0000000A | Установить позицию левого верхнего угла окна (x и y) |
| META_SETVIEWPORTEXT | 0x020E | EMR_SETVIEWPORTEXTEX | 0x0000000B | Установить размеры устройства вывода (ширину и высоту) |
| META_SETVIEWPORTORG | 0x020D | EMR_SETVIEWPORTORGEX | 0x0000000C | Установить позицию левого верхнего угла устройства вывода (x и y) |
| EMR_SETBRUSHORGEX | 0x0000000D | |||
| META_EOF | 0x0000 | EMR_EOF | 0x0000000E | Конец файла |
| EMR_SETPIXELV | 0x0000000F | |||
| META_SETMAPPERFLAGS | 0x0231 | EMR_SETMAPPERFLAGS | 0x00000010 | |
| META_SETMAPMODE | 0x0103 | EMR_SETMAPMODE | 0x00000011 | Задаёт режим преобразования логических единиц измерения окна в единицы измерения устройства вывода |
| META_SETBKMODE | 0x0102 | EMR_SETBKMODE | 0x00000012 | Установить режим заливки (0 — заливка выключена, 1 — заливка включена) |
| META_SETPOLYFILLMODE | 0x0106 | EMR_SETPOLYFILLMODE | 0x00000013 | |
| META_SETROP2 | 0x0104 | EMR_SETROP2 | 0x00000014 | Установить логическую операцию при рисовании (для накладывания прозрачного/инвертирующего изображения и т.п.) |
| META_SETSTRETCHBLTMODE | 0x0107 | EMR_SETSTRETCHBLTMODE | 0x00000015 | |
| META_SETTEXTALIGN | 0x012E | EMR_SETTEXTALIGN | 0x00000016 | Установить горизонтальное и вертикальное выравнивание (задаётся при помощи флагов, объединённых через логическое ИЛИ) |
| EMR_SETCOLORADJUSTMENT | 0x00000017 | |||
| META_SETTEXTCOLOR | 0x0209 | EMR_SETTEXTCOLOR | 0x00000018 | Установить цвет текста (32-битный RGB0) |
| META_SETBKCOLOR | 0x0201 | EMR_SETBKCOLOR | 0x00000019 | Установить цвет заливки (32-битный RGB0) |
| META_OFFSETCLIPRGN | 0x0220 | EMR_OFFSETCLIPRGN | 0x0000001A | |
| META_MOVETO | 0x0214 | EMR_MOVETOEX | 0x0000001B | |
| META_EXCLUDECLIPRECT | 0x0415 | EMR_EXCLUDECLIPRECT | 0x0000001D | |
| META_INTERSECTCLIPRECT | 0x0416 | EMR_INTERSECTCLIPRECT | 0x0000001E | |
| META_SCALEVIEWPORTEXT | 0x0412 | EMR_SCALEVIEWPORTEXTEX | 0x0000001F | Растянуть устройство вывода по горизонтали и вертикали (указывается два дробных множителя, по x и по y, каждый в виде двух целых чисел — числителя и знаменателя дроби) |
| META_SCALEWINDOWEXT | 0x0410 | EMR_SCALEWINDOWEXTEX | 0x00000020 | Растянуть окно по горизонтали и вертикали (указывается два дробных множителя, по x и по y, каждый в виде двух целых чисел — числителя и знаменателя дроби) |
| META_RESTOREDC | 0x0127 | EMR_RESTOREDC | 0x00000022 | Восстановить состояние устройства вывода в заранее сохранённое командой SAVEDC |
| META_SELECTOBJECT | 0x012D | EMR_SELECTOBJECT | 0x00000025 | |
| META_CREATEBRUSHINDIRECT | 0x02FC | EMR_CREATEBRUSHINDIRECT | 0x00000027 | |
| META_DELETEOBJECT | 0x01f0 | EMR_DELETEOBJECT | 0x00000028 | |
| EMR_ANGLEARC | 0x00000029 | |||
| META_ELLIPSE | 0x0418 | EMR_ELLIPSE | 0x0000002A | |
| META_RECTANGLE | 0x041B | EMR_RECTANGLE | 0x0000002B | |
| META_ROUNDRECT | 0x061C | EMR_ROUNDRECT | 0x0000002C | |
| META_ARC | 0x0817 | EMR_ARC | 0x0000002D | |
| META_CHORD | 0x0830 | EMR_CHORD | 0x0000002E | |
| META_PIE | 0x081A | EMR_PIE | 0x0000002F | |
| META_SELECTPALETTE | 0x0234 | EMR_SELECTPALETTE | 0x00000030 | |
| META_CREATEPALETTE | 0x00f7 | EMR_CREATEPALETTE | 0x00000031 | |
| META_SETPALENTRIES | 0x0037 | EMR_SETPALETTEENTRIES | 0x00000032 | Установить палитру |
| META_RESIZEPALETTE | 0x0139 | EMR_RESIZEPALETTE | 0x00000033 | |
| META_EXTFLOODFILL | 0x0548 | EMR_EXTFLOODFILL | 0x00000035 | |
| META_LINETO | 0x0213 | EMR_LINETO | 0x00000036 | |
| EMR_ARCTO | 0x00000037 | |||
| EMR_SETARCDIRECTION | 0x00000039 | |||
| EMR_SETMITERLIMIT | 0x0000003A | |||
| EMR_STROKEPATH | 0x00000040 | |||
| EMR_COMMENT | 0x00000046 | |||
| META_FILLREGION | 0x0228 | EMR_FILLRGN | 0x00000047 | |
| META_INVERTREGION | 0x012A | EMR_INVERTRGN | 0x00000049 | Обратить цвета в регионе, заданном объединением множества прямоугольников |
| META_PAINTREGION | 0x012B | EMR_PAINTRGN | 0x0000004A | |
| META_SELECTCLIPREGION | 0x012C | EMR_EXTSELECTCLIPRGN | 0x0000004B | |
| META_BITBLT | 0x0922 | EMR_BITBLT | 0x0000004C | |
| META_STRETCHBLT | 0x0B23 | EMR_STRETCHBLT | 0x0000004D | |
| META_SETDIBTODEV | 0x0d33 | EMR_SETDIBITSTODEVICE | 0x00000050 | |
| META_DIBSTRETCHBLT | 0x0b41 | EMR_STRETCHDIBITS | 0x00000051 | |
| META_CREATEFONTINDIRECT | 0x02FB | EMR_EXTCREATEFONTINDIRECTW | 0x00000052 | |
| META_CREATEPENINDIRECT | 0x02FA | EMR_EXTCREATEPEN | 0x0000005F | |
| EMR_SETICMMODE | 0x00000062 | |||
| EMR_CREATECOLORSPACE | 0x00000063 | |||
| EMR_SETCOLORSPACE | 0x00000064 | |||
| EMR_DELETECOLORSPACE | 0x00000065 | |||
| EMR_GLSRECORD | 0x00000066 | |||
| EMR_GLSBOUNDEDRECORD | 0x00000067 | |||
| EMR_PIXELFORMAT | 0x00000068 | |||
| EMR_FORCEUFIMAPPING | 0x0000006D | |||
| EMR_COLORCORRECTPALETTE | 0x0000006F | |||
| EMR_SETICMPROFILEA | 0x00000070 | |||
| EMR_SETICMPROFILEW | 0x00000071 | |||
| META_SETLAYOUT | 0x0149 | EMR_SETLAYOUT | 0x00000073 | Задаёт направление вывода текста и изображений — слева-направо или справа-налево (в последнем случае можно указать, требуется ли выводить изображения отражёнными слева-направо) |
| EMR_GRADIENTFILL | 0x00000076 | |||
| EMR_SETLINKEDUFIS | 0x00000077 | |||
| META_SETTEXTJUSTIFICATION | 0x020A | EMR_SETTEXTJUSTIFICATION | 0x00000078 | |
| META_REALIZEPALETTE | 0x0035 | |||
| META_SETRELABS | 0x0105 | |||
| META_SETTEXTCHAREXTRA | 0x0108 | |||
| META_DIBCREATEPATTERNBRUSH | 0x0142 | |||
| META_OFFSETVIEWPORTORG | 0x0211 | |||
| META_OFFSETWINDOWORG | 0x020F | |||
| META_FLOODFILL | 0x0419 | |||
| META_FRAMEREGION | 0x0429 | |||
| META_ANIMATEPALETTE | 0x0436 | |||
| META_TEXTOUT | 0x0521 | |||
| META_SETPIXEL | 0x041F | |||
| META_PATBLT | 0x061D | |||
| META_SAVEDC | 0x001E | Сохранить состояние устройства вывода | ||
| META_ESCAPE | 0x0626 | |||
| META_DIBBITBLT | 0x0940 | |||
| META_EXTTEXTOUT | 0x0a32 | |||
| META_STRETCHDIB | 0x0f43 | |||
| META_CREATEPATTERNBRUSH | 0x01F9 | |||
| META_CREATEREGION | 0x06FF |
Ссылки
-
(англ.) (англ.)
Без потерь: BMP • FPX • GIF • ICO • ILBM • JBIG • PCX • PNG • PNM • PSD • RAW • TGA • WBMP • XCF • Включая сжатие с потерями: EXR • ICER • JBIG2 • JPEG / JP2 / JPEG-LS • JPEG XR (HD Photo) • PGF (англ.) • TIFF • WebP • Анимационные: APNG • GIF • MNG
AI • CDR • EMF • EPS • PS • SVG • WMF • XPS • Анимационные: SVG • SWF • 3D: 3DS • VRML • X3D