---
title: "Обработка Windows метафайлов в Java"
---


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/java/com.aspose.words/metafilerenderingoptions/) позволяет управлять проигрывателем метафайлов. Например, вы можете определить, как должны отображаться изображения из метафайлов, используя свойство [RenderingMode](https://reference.aspose.com/words/java/com.aspose.words/metafilerenderingmode/), которое имеет особое значение при преобразовании в растровые изображения (см. также свойство [MetafileRenderingOptions](https://reference.aspose.com/words/java/com.aspose.words/imagesaveoptions/#getMetafileRenderingOptions)).

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

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

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

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

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

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

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

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

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

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

{{% /alert %}}

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

{{< gist "aspose-words-gists" "827e71ccc0b8516a3cfe247b86ce6d4e" "Examples-src-main-java-com-aspose-words-examples-rendering_printing-HandleDocumentWarnings-HandleDocumentWarnings.java" >}}

{{< gist "aspose-words-gists" "827e71ccc0b8516a3cfe247b86ce6d4e" "Examples-src-main-java-com-aspose-words-examples-rendering_printing-RenderMetafileToBitmap-RenderMetafileToBitmap.java" >}}
