Обработка метафайлов 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).

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

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

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

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

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

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

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
public class HandleDocumentWarnings implements IWarningCallback {
/**
* Our callback only needs to implement the "Warning" method. This method is
* called whenever there is a potential issue during document processing. The
* callback can be set to listen for warnings generated during document load
* and/or document save.
*/
public void warning(WarningInfo info) {
// For now type of warnings about unsupported metafile records changed from
// DataLoss/UnexpectedContent to MinorFormattingLoss.
if (info.getWarningType() == WarningType.MINOR_FORMATTING_LOSS) {
System.out.println("Unsupported operation: " + info.getDescription());
mWarnings.warning(info);
}
}
public WarningInfoCollection mWarnings = new WarningInfoCollection();
}
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Load the document from disk.
Document doc = new Document(dataDir + "Rendering.doc");
MetafileRenderingOptions metafileRenderingOptions = new MetafileRenderingOptions();
metafileRenderingOptions.setEmulateRasterOperations(false);
metafileRenderingOptions.setRenderingMode(MetafileRenderingMode.VECTOR_WITH_FALLBACK);
// If Aspose.Words cannot correctly render some of the metafile records to
// vector graphics then Aspose.Words renders this metafile to a bitmap.
HandleDocumentWarnings callback = new HandleDocumentWarnings();
doc.setWarningCallback(callback);
PdfSaveOptions saveOptions = new PdfSaveOptions();
saveOptions.setMetafileRenderingOptions(metafileRenderingOptions);
doc.save(dataDir + "PdfSaveOptions.HandleRasterWarnings_out.pdf", saveOptions);