SVG, экспортированный в EMF, теряет точность, но экспортируется, поскольку PNG выглядит хорошо


1

Я программист Windows, который должен конвертировать определенный SVG в EMF, чтобы использовать его для программирования.

Мои навыки графического дизайна находятся на начальном уровне, но мне удалось успешно конвертировать файл SVG в EMF с помощью Inkscape. Однако результат не выглядит оригинальным, он, так сказать, менее «точен». Если я экспортирую SVG как PNG, результат будет таким же, как и у исходного файла. К сожалению, мне нужен векторный формат, который распознает Windows, и это только EMF (я использую чистый WinAPI и C ++, поэтому это ограничение ...).

Чтобы точно понять, что я имею в виду, ссылка на оригинальный SVG, а также EMF и PNG, которые я сделал, находится здесь . Просто нажмите на Download: test.rar над 5 желтыми звездами (см. Рисунок ниже).

введите описание изображения здесь

Похоже, проблема заключается в размерах файла EMF (он должен быть 90 x 120), так как изображение становится кристально чистым, когда я изменяю размер приложения до больших размеров.

Я прошу вашей помощи, чтобы получить то же графическое качество файла EMF, что и оригинальный SVG.

Чтобы еще больше помочь вам в ваших усилиях по решению моей проблемы, вот небольшое приложение, которое будет отображать ЭДС в окне. Просто сохраните EMF в том же месте, где находится приложение, и назовите EMF как test.emf.

Спасибо за ваше время и усилия. С уважением.


1
"чтобы получить то же графическое качество файла EMF, что и исходный файл EMF"? Не оригиналы SVG ...
martineau

@martineau: я имел в виду "как оригинальный SVG" ... я редактировал свой пост. Спасибо за ваше исправление.
AlwaysLearningNewStuff

Проблема «точности» может быть присуща формату EMF (или ограничению функциональности Inkscape export_to_EMF). Возможно, вам удастся обойти это, экспортировав файлы SVG с более высоким разрешением (например, двойным), а затем уменьшив их, когда вы разместите их с помощью WinAPI.
Мартино

@martineau: проблема «точности» может быть присуща формату EMF -> это вполне может иметь место, потому что даже онлайн-конвертеры дали тот же результат. Возможно, вам удастся обойти это, экспортировав файлы SVG с более высоким разрешением -> вы имеете в виду, если я хочу изображение 100 x 100, тогда мне понадобится как минимум 200 x 200 SVG?
AlwaysLearningNewStuff

1
Я думаю, что это был краткий сбой с сайта обмена, ссылка работает нормально.
harrymc

Ответы:


2

Я сделаю сравнение с вашей тестовой графикой:

  1. Это файл PNG, который вы предоставляете, так что это, вероятно, желаемый результат:

    введите описание изображения здесь

  2. Выход вашего кода, ок. в том же размере:

    введите описание изображения здесь

  3. Предоставляемый вами файл EMF отображается в IrfanView (снова примерно того же размера)

    введите описание изображения здесь

  4. То же, что и 3., но с View -> Display Options -> Use Resampleвключенным:

    введите описание изображения здесь

Заключение

Так как 4. выглядит как 1. (то есть желаемый результат), я пришел к выводу, что преобразование в формат EMF совершенно нормально, но ваш код масштабирует графику с помощью простого, возможно, пиксельного алгоритма. Так что ИМХО вам нужно реализовать, например, процедуру билинейной интерполяции .


Я проголосовал за ваш ответ, так как мне кажется, что вы нашли проблему и решение. Тем не менее, я немного ошеломлен, разве EMF не должен быть векторным форматом, то есть не терять качество во время масштабирования?
AlwaysLearningNewStuff

IrfanView очень плохо отображает ЭДС. Я также попробовал это, и это делает ужасные вещи. Я думаю, что он преобразует EMF в маленькое растровое изображение, а затем отображает его в увеличенном масштабе, что вызывает пикселизацию. Повторная выборка изображения применяется только к растровым изображениям, но не к векторной графике, которая должна отображаться правильно при любом размере.
harrymc

@harrymc: Я согласен с вашими замечаниями, но мое приложение делает то же самое (запустите его и проверьте). это действительно очень странное поведение. Я действительно ошеломлен и опубликую вопрос об этом в StackOverflow, чтобы посмотреть, что не так. Тем временем я прошу вас попробовать конвертировать файл SVG в EMF с помощью Adobe Illustrator или Photoshop, просто чтобы посмотреть, как будет работать мое приложение. Это даст мне полезную информацию для парней в StackOverflow . Спасибо.
AlwaysLearningNewStuff

Вы можете попробовать то же самое? Чтобы преобразовать SVG в EMF с помощью Adobe Illustrator или чего-то еще, и протестировать его с моим приложением? Спасибо.
AlwaysLearningNewStuff

2

При просмотре с помощью Photoshop у EMF нет добавленного фрейма, поэтому это проблема для зрителя.

Я не могу загрузить вашу программу просмотра по какой-то непонятной причине. Я использовал Free WMF Viewer для просмотра вашей картинки EMF,

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

Я также просмотрел вашу EMF, используя старый просмотрщик wmf / emf, который я когда-то написал, который также не показывает черную рамку. Я отмечаю, что в моем собственном средстве просмотра я использовал ограничивающий прямоугольник только для определения соотношения сторон изображения (высота и ширина), чтобы правильно отображать его, то есть не сжимать и не растягивать.

Мой вывод заключается в том, что оба зрителя отображают ограничивающий прямоугольник в виде рамки. Это неверно, поскольку его целью является предоставление информации о рекомендованном прямоугольнике просмотра изображения, а не его отображение. Таким образом, ваш процесс генерации ЭДС кажется правильным.


Я проголосовал за ваш пост, потому что обнаружил задокументированные проблемы с EMF на сайте Inkscape (сейчас ссылку не помню). Они в основном говорят, что SVG должен быть «простым» (сплошная заливка простых штрихов и тому подобное), иначе будут проблемы. Как я уже просил в своем комментарии к ответу члена mpy , можете ли вы преобразовать SVG, который я загрузил, в EMF с помощью Illustrator и проверить его с помощью моего приложения? Спасибо.
AlwaysLearningNewStuff

Illustrator может отображать SVG, но моя версия не знает, как сохранить в формате EMF. Я отмечаю, что другой художник изображений, который я использовал, спрашивал о размере перед отображением SVG, отображать ли он в соответствии с заданным размером или в соответствии с размером ограничивающей рамки (имеется в виду прямоугольник просмотра). Я думаю, что эта ограничительная рамка в SVG - это то, что Inkscape плохо переводит в EMF.
harrymc

Я ценю ваши усилия. SVG был создан с помощью Inkscape путем преобразования файла Corel Draw. Возможно, если я использую другой инструмент для создания SVG, ошибки исчезнут. В моем основном приложении я отображаю EMF, экспортированный из другой программы (ArcGis), и все работает отлично. Я просто надеюсь, что это какая-то ошибка в Inkscape, а не большая проблема, которую я должен решить. Спасибо, мы скоро снова поговорим.
AlwaysLearningNewStuff

Я попробовал старый просмотрщик wmf / emf, который я когда-то написал, и он также не показывает черную рамку. Я отмечаю, что я использовал ограничивающую рамку только для определения соотношения сторон изображения (высота и ширина), чтобы изображение отображалось правильно. Я все еще думаю, что зрители, которые его отображают, неправильно интерпретируют это поле, поскольку его назначение не должно отображаться.
Harrymc

Я скачал Adobe Illustrator (пробная версия) и экспортировал оригинальный файл EPS в EMF. Результат остался прежним. Обращаясь за помощью в StackOverflow, я получил ответ, который манипулировал файлом перед его показом. Это означает, что проблема в том, как моя структура выводит файл. Поэтому я решил принять другой ответ (я ранее проголосовал за ваш). Спасибо за ваше время и помощь, я очень ценю это.
AlwaysLearningNewStuff
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.