Обработка метафайлов Windows

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

Ранее метафайл Windows был единственным форматом векторных изображений, поддерживаемым Microsoft Word. Microsoft Word теперь также поддерживает формат SVG, но формат метафайла по-прежнему широко используется в документах Word. Кроме того, метафайл может быть форматом обмена для некоторых других приложений, таких как Microsoft Visio. По сути, основное назначение метафайла - обеспечить обмен графической информацией между приложениями Windows.

Существует 3 версий метафайла Windows:

  • WMF – сохраняет вызов 16-битного GDI.
  • EMF – сохраняет вызов Win32/GDI.
  • Метафайл EMF+ хранит вызов GDI+. Метафайл EMF+ также может быть двойным, описывая одну и ту же графику как с EMF, так и с EMF+ частями.

Существующая проблема с метафайлом Windows заключается в том, что он не поддерживается большинством форматов, отличных от Word, в которые обычно сохраняются документы. Поэтому требуется преобразовать формат метафайла в другие растровые или векторные форматы. Легко преобразовать метафайл Windows в растровое изображение в .NET, просто передав его в GDI+, но на других платформах это невозможно, поскольку даже GDI + не предоставляет функциональности для извлечения векторной графики из метафайла. Чтобы решить эти проблемы, Aspose.Words реализует свой собственный проигрыватель метафайлов Windows, который способен воспроизводить как векторную, так и растровую графику в формате метафайлов на всех платформах.

Управление проигрывателем метафайлов Aspose.Words

Класс MetafileRenderingOptions позволяет управлять проигрывателем метафайлов. Например, вы можете определить, как должны отображаться изображения из метафайлов, используя свойство RenderingMode, которое имеет особое значение при преобразовании в растровые изображения (см. также свойство MetafileRenderingOptions).

Сохранение в растровое изображение работает по-разному на платформах, отличных от .NET. Хотя рендеринг .NET GDI+ является эталонным и работает почти идеально даже для самых сложных форматов метафайлов, на других платформах он может вызывать проблемы или вообще не поддерживаться.

Поддержка растровых операций

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

Существуют бинарные и троичные растровые операции:

  • Бинарные растровые операции применяются к командам рисования пером, таким как рисование линий и кривых. При рисовании линии цвет пера комбинируется с цветом конечного растрового изображения (цветом соответствующего пикселя на поверхности устройства) с помощью определенных побитовых логических операций с шестнадцатеричными значениями цвета. Приведенный ниже пример изображения иллюстрирует эффект всех 16 бинарных растровых операций, примененных к 20 различным цветовым полосам. Сначала рисуются вертикальные цветные полосы, а горизонтальные полосы рисуются после применения каждой бинарной растровой операции. В простых случаях R2_BLACK рисует черным, R2_NOT меняет цвет на противоположный, R2_NOP не меняет фон, а R2_WHITE рисует белым.
handling-windows-metafiles-aspose-words-cpp-1
  • При рисовании растровых изображений применяются троичные растровые операции. Они объединяют цвета соответствующих пикселей растрового изображения, кисти и целевого растрового изображения с помощью побитовых логических операций с заданными шестнадцатеричными значениями цвета. Одной из наиболее распространенных целей использования троичных растровых операций является эмуляция прозрачности. Изображение, представленное в примере ниже, демонстрирует, как можно эмулировать прозрачность значка. Существует два типа растровых изображений: растровое изображение с черно-белой маской и цветное растровое изображение. Сначала с помощью операции SRCAND raster отрисовывается растровое изображение маски. Непрозрачная область значка изменяется на черно-белую, а прозрачная область остается неизменной. Затем с помощью операции SRCINVERT raster отрисовывается второе растровое изображение. Он отображает цветные пиксели на черной области, оставляя прозрачную область неизменной.
handling-windows-metafiles-aspose-words-cpp-2

Растровые операции не могут быть преобразованы непосредственно в векторную графику. Aspose.Words эмулирует растровые операции путем частичного растеризации поверхности устройства, на которую воздействуют растровые операции. Для этой цели используется свойство EmulateRasterOperations.

Приведенный ниже пример демонстрирует, как Aspose.Words преобразует метафайл в растровое изображение, когда невозможно корректно преобразовать некоторые записи метафайла в векторную графику:

Резервные настройки метафайла

Aspose.Words не поддерживает ряд наиболее сложных или редких функций метафайла. Пользователи могут реализовать интерфейс IWarningCallBack и получать предупреждающие сообщения. Если Aspose.Words обнаруживает неподдерживаемые функции в метафайле, он выдает предупреждающее сообщение с WarningSource.Metafile. В этом случае Aspose.Words может выполнить возврат к другому типу проигрывателя метафайлов. Также выдается предупреждающее сообщение о резервном варианте.

Во-первых, Aspose.Words выполняет переход от проигрывателя векторных метафайлов к растровому, который управляется свойством RenderingMode. Если функция возврата отключена, Aspose.Words пытается отобразить некоторую графику-заменитель вместо функций, которые не поддерживаются.

Aspose.Words успешно преобразует метафайл в растр с помощью GDI+ в .NET, что делает этот вариант обратного вызова безопасным.

Во-вторых, для двойного метафайла EMF+ есть возможность отказаться от воспроизведения части EMF+ в пользу части EMF. Это регулируется параметром EmfPlusDualRenderingMode. Если при воспроизведении части EMF возникают какие-либо проблемы, то также может быть выполнен резервный переход к растру.

Что касается растровых операций, то если параметр EmulateRasterOperations отключен, то растровые операции считаются неподдерживаемыми, что приводит к возврату к проигрывателю метафайлов bitmap, если он включен. Поэтому, если у вас есть метафайл с растровыми операциями, но вы не хотите использовать эмуляцию растровых операций и все же хотите получить векторный вывод с графикой подстановки, выберите MetafileRenderingMode.Vector.