Обробка метафайлів 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. Непрозора область значка змінюється на чорно-білу, а прозора область залишається незмінною. Потім за допомогою растрової операції SRCINVERT малюється друге растрове зображення. Він відображає кольорові пікселі на чорній області, залишаючи прозору область незмінною.
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.