Рисовать ЭДС со сглаживанием

Есть ли способ нарисовать метафайл emf (экспортированный из инструмента рисования) с включенным сглаживанием? Инструменты, которые я пробовал, не способны экспортировать файлы emf со сглаживанием, поэтому я задался вопросом, могу ли я снова включить его вручную при рисовании emf в переопределении OnPaint моих элементов управления.

Если кто-нибудь может подтвердить, что технически возможно генерировать файлы emf со сглаживанием, другим решением будет использование инструмента рисования, который может экспортировать в emf со сглаживанием, или сделать это позже с помощью стороннего конвертера. Если кто-нибудь знает такой инструмент, пожалуйста, сообщите мне.

РЕДАКТИРОВАТЬ: При просмотре инструкций emf не похоже, что сам emf может фактически хранить информацию о том, должно ли оно отображаться со сглаживанием или нет. По крайней мере, я ничего не нашел. Более вероятно, что сглаживание выполняется механизмом воспроизведения. Например, когда я открываю emf в Word 2007, он отображается со сглаживанием. Но не тогда, когда я рисую его с помощью «движка воспроизведения» GDI+ (Graphics.DrawImage(...)). или когда я просматриваю его стандартным средством просмотра изображений Windows. Это заставляет меня поверить, что некоторые инструменты на самом деле имеют свой собственный механизм воспроизведения emf. Так что, может быть, есть бесплатная библиотека .NET (желательно с исходным кодом), которая дает мне объектную модель инструкций emf, хранящихся в проанализированном файле emf, чтобы я мог воспроизвести ее самостоятельно вместо использования Graphics.DrawImage(...)?


person bitbonk    schedule 23.11.2009    source источник
comment
Если ничего не помогает, вы, вероятно, можете нарисовать его в четыре раза больше или около того, а затем уменьшить разрешение.   -  person Joey    schedule 23.11.2009
comment
Я пробовал это, при небольших размерах это все еще выглядит уродливо. Также при использовании этого подхода, вероятно, возникают уродливые накладные расходы на память. (Я буду отображать сразу много таких пользовательских элементов управления).   -  person bitbonk    schedule 23.11.2009
comment
Дубликат: stackoverflow.com/questions/1422949/   -  person liori    schedule 23.11.2009
comment
Маленькие размеры будут смотреться некрасиво, несмотря ни на что, потому что ваши точки будут отбрасываться на целочисленные границы пикселей. Вы должны выбрать, какой стиль уродства наиболее приемлем.   -  person Mark Ransom    schedule 23.11.2009
comment
Не забудьте установить для InterpolationMode значение HighQualityBicubic перед субдискретизацией.   -  person Dan Byström    schedule 23.11.2009
comment
Вы можете преобразовать файл EMF во время выполнения в метафайл EMF+. Вот C#, как это сделать.   -  person codekaizen    schedule 28.06.2016


Ответы (3)


У нас была похожая проблема в проекте DirectX. Увеличение и уменьшение масштаба работает до определенной степени, но это имитация. Если это то, что вам нужно делать снова и снова, вы, возможно, могли бы проанализировать записи WMF и нарисовать их с помощью сглаживания GDI+.

Следующие темы подтверждают это (но они из 2005 года, так что все могло измениться):

http://www.dotnet247.com/247reference/msgs/28/144605.aspx

http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-sdk/1127/Graphics-DrawImage-metafile-no-antialiasing

[Редактировать:]

Эти три программы могут сделать всю работу за вас: я предполагаю, что вы можете сделать это вручную:

http://emf-to-vector-converter-command-line-ser.smartcode.com/info.html

http://www.verypdf.com/pdf-editor/index.html

http://www.ivanview.com/converter/emf-batch-converter.html

[Редактировать II:]

Что ж, вот программа, которая позволит вам проверить ЭДС различными способами:

http://download.cnet.com/windows/3055-2383_4-10558240.html?tag=pdl-redir

...и вот бесплатная библиотека, которая позволит вам проанализировать 122 команды EMF и вывести их в GDI+. Вероятно, это должно помочь:

http://www.codeproject.com/KB/GDI-plus/emfexplorer.aspx?msg=2359423

...о, и обратите внимание на комментарий №3 на странице codeproject. Похоже, кто-то уже стучал головой о стену. Надеюсь, это решит вашу проблему.

person Pedery    schedule 23.11.2009
comment
Эти программы, похоже, просто конвертируют его в другие форматы файлов. Мы выбрали EMF для отображения векторной графики, потому что это единственный векторный формат, который может обрабатывать GDI+. Нам нужно рисовать рисунок из кода (отсюда GDI+), потому что мы динамически модифицируем его во время выполнения и анимируем. Кроме того, отображение ЭДС с помощью GDI+, скорее всего, является наиболее удобным для процессора и памяти способом отображения векторной графики. Использование другого формата, который emf просто не кажется полезным. Классным решением было бы иметь конвертер Vectorgrafik (любого формата) в C# GDI+. - person bitbonk; 26.11.2009
comment
В таком случае, почему бы вам не использовать систему рисования с сохраненным режимом и полностью отказаться от EMF? Теоретически вы можете хранить изображения EMF и использовать пользовательскую библиотеку для извлечения каждой формы и повторного рисования их с помощью GDI (+). Однако, исходя из вашего описания проблемы, я бы создал собственный формат, который просто описывает изображения с помощью объектов, а затем отображает их на любой рассматриваемой поверхности. Другой подход может заключаться в использовании swf, который гораздо лучше поддерживается, хорошо документирован и IMO более универсален. - person Pedery; 26.11.2009
comment
Мы не можем использовать проприетарный формат, потому что нам нужно рисовать с помощью обычного программного обеспечения для рисования (illustrator, inkscape, coreldraw... одного из них). - person bitbonk; 27.11.2009

EMF использует команды GDI, а не GDI+, поэтому в нем нет понятия сглаживания. Я подозреваю, что когда вы просите GDI+ отобразить файл, он отправляет его в GDI и просто копирует полученное растровое изображение.

Дублирование этого в коде было бы таким же, как повторная реализация GDI, поэтому это не очень осуществимо. Не невозможно, просто объем работы больше, чем оправдывает выгода. Если есть утилита с открытым исходным кодом, которая может открывать файлы EMF за пределами Windows, вы можете изучить исходный код.

Я предполагаю, что Word использует трюк с понижением частоты дискретизации.

person Mark Ransom    schedule 25.11.2009

Файл EMF представляет собой список команд GDI. Таким образом, он не будет сглажен, даже если в GDI+ вы поместите вызов SmoothingMode() перед рисованием. Вам нужно будет перечислить команды GDI, а затем перевести их в команды GDI+.

В Vista/Seven вы можете использовать функцию GDI+ 1.1 с именем GdipConvertToEmfPlus/ConvertToEmfPlus. Если вы хотите, чтобы ваша программа работала с XP, вы должны написать собственное перечисление, а затем преобразовать его в команды GDI+.

Перечисление GDI, после чего возможно преобразование в GDI+, было выполнено с помощью emfexplorer, но я написал некоторый код, возможно, более простой для понимания, даже если он написан на Delphi.

Я ставлю этот ответ только сейчас (я опаздываю), потому что я потратил много времени на поиск решения с использованием ConvertToEmfPlus и написание некоторого настроенного открытого исходного кода на случай, если этот метод недоступен.

person Arnaud Bouchez    schedule 20.01.2011