---
title: "Обработка метафайлов 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](https://reference.aspose.com/words/python-net/aspose.words.saving/metafilerenderingoptions/) позволяет управлять проигрывателем метафайлов. Например, вы можете определить, как должны отображаться изображения из метафайлов, используя свойство [rendering_mode](https://reference.aspose.com/words/python-net/aspose.words.saving/metafilerenderingoptions/rendering_mode/), которое имеет особое значение при преобразовании в растровые изображения (см. также свойство [ImageSaveOptions.metafile_rendering_options](https://reference.aspose.com/words/python-net/aspose.words.saving/imagesaveoptions/metafile_rendering_options/)).

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

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

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

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

- Бинарные растровые операции применяются к командам рисования пером, таким как рисование линий и кривых. При рисовании линии цвет пера комбинируется с цветом конечного растрового изображения (цветом соответствующего пикселя на поверхности устройства) с помощью определенных побитовых логических операций с шестнадцатеричными значениями цвета. Приведенный ниже пример изображения иллюстрирует эффект всех 16 бинарных растровых операций, примененных к 20 различным цветовым полосам. Сначала рисуются вертикальные цветные полосы, а горизонтальные полосы рисуются после применения каждой бинарной растровой операции. В простых случаях R2_BLACK рисует черным, R2_NOT изменяет цвет на противоположный, R2_NOP не изменяет фон, а R2_WHITE рисует белым.

<img src="handling-windows-metafiles-1.png" alt="handling-windows-metafiles-aspose-words-net-1" style="width:650px"/>

- При рисовании растровых изображений применяются троичные растровые операции. Они объединяют цвета соответствующих пикселей растрового изображения, кисти и целевого растрового изображения с помощью побитовых логических операций с заданными шестнадцатеричными значениями цвета. Одной из наиболее распространенных целей использования троичных растровых операций является эмуляция прозрачности. Изображение, представленное в примере ниже, демонстрирует, как можно эмулировать прозрачность значка. Существует два типа растровых изображений: растровое изображение с черно-белой маской и цветное растровое изображение. Сначала растровое изображение маски рисуется с помощью растровой операции SRCAND. Непрозрачная область значка изменяется на черно-белую, а прозрачная область остается неизменной. Затем с помощью растровой операции SRCINVERT рисуется второе растровое изображение. Он отображает цветные пиксели на черной области, оставляя прозрачную область неизменной.

<img src="handling-windows-metafiles-2.png" alt="handling-windows-metafiles-aspose-words-net-2" style="width:650px"/>

Растровые операции не могут быть преобразованы непосредственно в векторную графику. Aspose.Words эмулирует растровые операции путем частичного растеризации поверхности устройства, на которую воздействуют растровые операции. Для этой цели используется свойство [emulate_raster_operations](https://reference.aspose.com/words/python-net/aspose.words.saving/metafilerenderingoptions/emulate_raster_operations/).

{{% alert color="primary" %}}

Хотя бинарные растровые операции в настоящее время не поддерживаются, а Aspose.Words поддерживает ограниченное количество троичных растровых операций, он может напрямую обрабатывать основные случаи преобразования в векторную графику, например, R2_BLACK, R2_WHITE, R2_NOP. Кроме того, растеризация поверхности устройства существенно влияет на производительность, особенно когда задействовано значительное количество записей операций растрирования.

{{% /alert %}}

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

{{< highlight python >}}
# 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)
{{< /highlight >}}

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

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

Во-первых, Aspose.Words выполняет переход от проигрывателя векторных метафайлов к проигрывателю растровых файлов, который управляется свойством [rendering_mode](https://reference.aspose.com/words/python-net/aspose.words.saving/metafilerenderingoptions/rendering_mode/). Если функция возврата отключена, Aspose.Words пытается отобразить некоторую графику-заменитель вместо функций, которые не поддерживаются.

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

Во-вторых, для двойного метафайла EMF+ предусмотрена возможность возврата от воспроизведения части EMF+ к части EMF. Это контролируется параметром [emf_plus_dual_rendering_mode](https://reference.aspose.com/words/python-net/aspose.words.saving/metafilerenderingoptions/emf_plus_dual_rendering_mode/). Если при воспроизведении части EMF возникнут какие-либо проблемы, то также может быть выполнен резервный переход к растру.

Что касается растровых операций, то если параметр [emulate_raster_operations](https://reference.aspose.com/words/python-net/aspose.words.saving/metafilerenderingoptions/emulate_raster_operations/) отключен, то растровые операции считаются неподдерживаемыми, что запускает резервный режим воспроизведения метафайлов bitmap, если он включен. Поэтому, если у вас есть метафайл с растровыми операциями, но вы не хотите использовать эмуляцию растровых операций и все же хотите получить векторный вывод с графикой подстановки, выберите [MetafileRenderingMode.VECTOR](https://reference.aspose.com/words/python-net/aspose.words.saving/metafilerenderingmode/#vector).
