Нарисуйте emf antialiased

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

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

EDIT: при взгляде на инструкции emf не похоже, что сам emf может фактически хранить информацию, независимо от того, будет ли она отображаться сглаженной или нет. По крайней мере, я ничего не нашел. Более вероятно, что сглаживание выполняется механизмом воспроизведения. Например, когда я открываю emf в Word 2007, он отображается сглаженным. Но не тогда, когда я рисую его с помощью GDI+ "playback engine" (Graphics.DrawImage(...)). или когда я просматриваю его стандартным средством просмотра изображений windows. Это заставляет меня поверить, что некоторые инструменты на самом деле имеют свой собственный движок воспроизведения emf. Поэтому, возможно, есть бесплатная библиотека .NET (желательно с исходным кодом), которая дает мне объектную модель инструкций emf, хранящихся в проанализированном файле emf, чтобы я мог воспроизвести ее сам, а не использовать Graphics.DrawImage(...)?

3 ответов


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

следующие потоки поддерживают это (но они из 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

[Edit:]

эти три программы может сделайте работу для вас: я предполагаю, что вы в порядке с этим рука:

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

[Edit 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. Похоже, кто-то ударился головой. раньше к стене. Надеюсь, это решит вашу проблему.


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

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

Я предполагаю, что это слово использует трюк downsampling.


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

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

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

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