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

2641
AlwaysLearningNewStuff

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

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

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

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

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

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

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

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

1
"получить такое же графическое качество файла EMF, как и исходный EMF"? Не оригиналы SVG ... martineau 9 лет назад 1
@martineau: я имел в виду "как оригинальный SVG" ... я редактировал свой пост. Спасибо за ваше исправление. AlwaysLearningNewStuff 9 лет назад 0
Проблема «точности» может быть присуща формату EMF (или ограничению функциональности Inkscape export_to_EMF). Возможно, вам удастся обойти это, экспортировав файлы SVG с более высоким разрешением (например, двойным), а затем уменьшив их, когда вы разместите их с помощью WinAPI. martineau 9 лет назад 0
@martineau: * Проблема "точности" может быть присуща формату EMF * -> это может иметь место, потому что даже онлайн-конвертеры дали тот же результат. * Возможно, вам удастся обойти эту проблему, экспортировав файлы SVG с более высоким разрешением * -> Вы имеете в виду, если я хочу изображение 100 x 100, тогда мне понадобится как минимум 200 x 200 SVG? AlwaysLearningNewStuff 9 лет назад 0
Да, это то, что я имел в виду. Вы должны иметь возможность уменьшить его до исходного размера, когда вы размещаете его с помощью Windows API. martineau 9 лет назад 0
@martineau: я пытался увеличить его до 200 х 200, но безуспешно. Затем я попытался увеличить его до 800 х 800, но снова это не удалось. Наконец я попытался с разрешением 600 x 600, но опять не повезло ... Я пошел в * Object-> Transform * и выбрал * Scale * в диалоговом окне Inkscape. Я даже пытался с опцией * Применить к каждому объекту отдельно *, но она мне тоже не помогла ... Может быть, я делаю что-то не так, можете ли вы попытаться сделать то, что вы предлагаете, с SVG, на который я ссылался в моем посте? Спасибо. AlwaysLearningNewStuff 9 лет назад 0
Что вы подразумеваете под "не было успеха" и "не удалось"? После того, как вы сделаете это со всем в файле SVG, экспортируйте его снова, и попробуйте снова получить к нему доступ через WinAPI и C ++? martineau 9 лет назад 0
@martineau: * Что вы подразумеваете под словами «не удалось» и «не удалось»? * -> качество изображения осталось прежним. * После того, как вы сделаете это со всем в SVG-файле, снова экспортируете его и попробуйте снова получить к нему доступ через WinAPI и C ++? * После увеличения изображения я нажимаю * Сохранить *, чтобы сохранить изменения, затем * Сохранить как * и сохраните это как EMF. Качество изображения остается неизменным. ** Я заметил то же самое, когда Explorer отображает изображение. Inkscape предупредил, что некоторые детали могут быть потеряны при закрытии программы, и попросил сохранить его как SVG вместо EMF. ** Возможно, последняя часть важна? AlwaysLearningNewStuff 9 лет назад 0
Вполне возможно, что при сохранении файла в формате EMF он преобразуется в изображение - файлы EMF могут содержать как встроенные растровые изображения, так и векторную графику. Для наивысшего качества и согласованности я предлагаю вам попытаться найти способ использовать оригинальную графику SVG, а не конвертировать ее. martineau 9 лет назад 0
Только одно отличие между предоставленными SVG и EMF привлекло мое внимание: в первом случае у вас нет черного контура, например, белых волн, но во втором у вас есть. Этот контур не уменьшен, поэтому вы можете испортить ваш EML в небольших масштабах. Поскольку я не совсем уверен, мы говорим об одной и той же проблеме (некоторые графики в вашем вопросе могут быть полезны), пожалуйста, проверьте мой отредактированный файл EMF: http://www.speedyshare.com/zBS7q/test-mod. emf - если это выглядит хорошо, возможно, вы можете найти опцию экспорта Inkscape относительно контура (я не знаю Inkscape ... Я использовал CorelDRAW для создания этого файла). mpy 9 лет назад 0
@mpy: я проверил вашу ЭДС и получил тот же результат. Пожалуйста, наберитесь терпения, я напишу небольшое приложение, которое поможет вам с тестированием и загрузит его. Я отредактирую свой пост со ссылкой на это приложение и сообщу вам. Спасибо за попытку помочь, я ценю это! AlwaysLearningNewStuff 9 лет назад 0
Не проще ли опубликовать два изображения (желаемый результат и результат из вашего кода? mpy 9 лет назад 0
@mpy: готово! Смотрите мою отредактированную запись по ссылке. Не забудьте следовать простым инструкциям, чтобы все могло работать правильно. AlwaysLearningNewStuff 9 лет назад 0
(Ваша ссылка на программу просмотра EMF неверна.) Я согласен, что с вашей EMF все в порядке. При просмотре в Photoshop у EMF нет добавленного фрейма, так что, похоже, это проблема вашего зрителя. harrymc 9 лет назад 0
@harrymc: * Ваша ссылка на программу просмотра EMF плохая. * Я не понимаю, нажали ли вы на "Download: EMF app.rar", только выше 5 желтых звездочек? Вы хранили файл и программу EMF в одном месте, например, в одном каталоге? * При просмотре в Photoshop у EMF нет добавленной рамки, так что, похоже, это проблема вашего зрителя * Я не понимаю эту часть, но я вам верю. Можете ли вы объяснить, что вы имеете в виду (если он не слишком широк, конечно)? Спасибо. AlwaysLearningNewStuff 9 лет назад 0
Я думаю, что это был краткий сбой с сайта обмена, ссылка работает нормально. harrymc 9 лет назад 1
@harrymc: ОК, нет проблем. Кажется, что ответ ниже проливает некоторый полезный свет. Я использую нативный `GDI` и, вероятно, он использует простой алгоритм масштабирования. Я просто не понимаю, зачем мне алгоритм передискретизации, когда ЭДС в векторном формате ... AlwaysLearningNewStuff 9 лет назад 0

2 ответа на вопрос

2
mpy

I'll make a comparison with your test graphic:

  1. This is the PNG file you provide, so this probably is the desired result:

    enter image description here

  2. The output of your code, approx. at the same size:

    enter image description here

  3. The EMF file you provide, displayed in IrfanView (again approx. the same size)

    enter image description here

  4. Same as 3., but with View -> Display Options -> Use Resample turned on:

    enter image description here

Conclusion

As 4. look similar to 1. (i.e. the desired result), my conclusion is that the conversion to EMF format is perfectly fine, but your code scales the graphic with a simple, probably pixel based algorithm. So IMHO you need to implement e.g. a bilinear interpolation routine.

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

When viewed with Photoshop, the EMF does not have an added frame, so this seems to be a problem with the viewer.

Not able to download your viewer for some obscure reason, I have used the Free WMF Viewer to view your EMF image,

The EMF file looks perfect - it scales up and down perfectly as should a vector graphics image. But that viewer also shows a black frame around the image.

I have also viewed your EMF using an old wmf/emf viewer that I have once written, which also doesn't show the black frame. I remark that in my own viewer I have used the bounding box only to determine the aspect ratio of the image (height vs. width), so as to display it correctly, meaning not squashed or stretched.

My conclusion is that both viewers display the bounding box as a frame. This is incorrect, since its purpose is to give information about the image's recommended viewing rectangle, rather than be displayed. Your process of generating the EMF seems therefore to be correct.

Я проголосовал за ваш пост, потому что обнаружил задокументированные проблемы с EMF на сайте Inkscape (сейчас ссылку не помню). Они в основном говорят, что SVG должен быть «простым» (сплошная заливка простых штрихов и тому подобное), иначе будут проблемы. Как я и просил в своем комментарии к ответу * mpy участника, вы можете конвертировать SVG, который я загрузил, в EMF с помощью Illustrator и проверить его с помощью моего приложения? Спасибо. AlwaysLearningNewStuff 9 лет назад 0
Illustrator может отображать SVG, но моя версия не знает, как сохранить в формате EMF. Я отмечаю, что другой художник по рисованию, который я использовал, спрашивал о размере перед отображением SVG, отображать ли он в соответствии с заданным размером или в соответствии с размером ограничительной рамки (имеется в виду прямоугольник просмотра). Я думаю, что эта ограничительная рамка в SVG - это та, которая плохо переведена Inkscape на EMF. harrymc 9 лет назад 0
Я ценю ваши усилия. SVG был создан с помощью Inkscape путем преобразования файла Corel Draw. Возможно, если я использую другой инструмент для создания SVG, ошибки исчезнут. В моем основном приложении я отображаю EMF, экспортированный из другой программы (ArcGis), и все работает отлично. Я просто надеюсь, что это какая-то ошибка в Inkscape, а не большая проблема, которую я должен решить. Спасибо, мы скоро "поговорим". AlwaysLearningNewStuff 9 лет назад 0
Я попробовал старый просмотрщик wmf / emf, который я когда-то написал, и он также не показывает черную рамку. Замечу, что я использовал там ограничивающую рамку только для определения соотношения сторон изображения (высота и ширина), чтобы изображение отображалось правильно. Я все еще думаю, что зрители, которые его отображают, неправильно интерпретируют это поле, поскольку его назначение не должно отображаться. harrymc 9 лет назад 0
Я скачал Adobe Illustrator (пробная версия) и экспортировал оригинальный файл EPS в EMF. Результат остался прежним. Обращаясь за помощью в StackOverflow, я получил ответ, который манипулировал файлом перед его показом. Это означает, что проблема в том, как моя структура выводит файл. Поэтому я решил принять другой ответ (я ранее проголосовал за ваш). Спасибо за ваше время и помощь, я очень ценю это. AlwaysLearningNewStuff 9 лет назад 0