Обработка метафайлов 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 позволяет управлять проигрывателем метафайлов. Например, вы можете определить, как должны отображаться изображения из метафайлов, используя свойство rendering_mode, которое имеет особое значение при преобразовании в растровые изображения (см. также свойство ImageSaveOptions.metafile_rendering_options).

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

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

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

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

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

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

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

# Load the document from disk.
doc = aw.Document(docs_base.my_dir +  "Rendering.docx")

metafileRenderingOptions = aw.saving.MetafileRenderingOptions()
metafileRenderingOptions.emulate_raster_operations = False
metafileRenderingOptions.rendering_mode = aw.saving.MetafileRenderingMode.VECTOR_WITH_FALLBACK

saveOptions = aw.saving.PdfSaveOptions()
saveOptions.metafile_rendering_options = metafileRenderingOptions

doc.save(docs_base.artifacts_dir +"PdfSaveOptions.HandleRasterWarnings.pdf", saveOptions)

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

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

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

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

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

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