SVG, das in EMF exportiert wird, verliert an Präzision, aber als PNG-Export sieht es gut aus

2741
AlwaysLearningNewStuff

Ich bin ein Windows-Desktop-Programmierer, der bestimmte SVG-Dateien in EMF konvertieren muss, um sie zur Programmierung verwenden zu können.

Meine Grafikdesignfähigkeiten sind Anfänger, aber es ist mir gelungen, SVG-Dateien mit Inkscape erfolgreich in EMF zu konvertieren. Das Ergebnis sieht jedoch nicht so aus wie das Original, es ist also weniger "genau". Wenn ich die SVG-Datei als PNG-Datei exportiere, stimmt das Ergebnis mit der Originaldatei überein. Leider brauche ich ein Vektorformat, das Windows erkennt und das nur EMF ist (ich verwende reine WinAPI und C ++, daher diese Einschränkung ...).

Um genau zu sehen, was ich meine, verlinke ich auf das Original-SVG, und EMF und PNG, die ich gemacht habe, finden Sie hier . Klicken Sie einfach auf Download: test.rar über den 5 gelben Sternen (siehe Abbildung unten).

SVG, das in EMF exportiert wird, verliert an Präzision, aber als PNG-Export sieht es gut aus

Das Problem scheint die Abmessungen der EMF-Datei zu sein (sie sollte 90 x 120 sein), da das Bild kristallklar ist, wenn ich meine Anwendung auf größere Abmessungen skaliere.

Ich bitte Sie um Hilfe, um die gleiche Grafikqualität der EMF-Datei zu erhalten wie das Original-SVG.

Um Ihnen weiter bei der Lösung meines Problems zu helfen, finden Sie hier eine kleine Anwendung, die EMF in einem Fenster anzeigt. Behalten Sie einfach den EMF an der gleichen Stelle, an der sich die Anwendung befindet, und nennen Sie den EMF als test.emf.

Vielen Dank für Ihre Zeit und Mühe. Freundliche Grüße.

1
msgstr "um die gleiche Grafikqualität der EMF - Datei zu erhalten wie der ursprüngliche EMF"? Sind nicht die Original-SVGs ... martineau vor 9 Jahren 1
@martineau: Ich meinte "als Original-SVG" ... Ich habe meinen Beitrag bearbeitet. Danke für deine Korrektur. AlwaysLearningNewStuff vor 9 Jahren 0
Das Problem der "Genauigkeit" kann im EMF-Format (oder einer Einschränkung der Funktionalität von export_to_EMF von Inkscape) liegen. Möglicherweise können Sie das Problem umgehen, indem Sie die SVG-Dateien mit einer höheren Auflösung (z. B. double) exportieren und dann beim Platzieren mit der WinAPI wieder verkleinern. martineau vor 9 Jahren 0
@martineau: * Das Problem der "Genauigkeit" ist möglicherweise im EMF-Format enthalten. * -> Dies kann durchaus der Fall sein, da selbst Online-Konverter dasselbe Ergebnis erzielen. * Möglicherweise können Sie dies umgehen, indem Sie die SVG-Dateien mit einer höheren Auflösung exportieren. * -> Sie meinen, wenn ich ein 100 x 100-Bild möchte, dann brauche ich mindestens 200 x 200 SVG? AlwaysLearningNewStuff vor 9 Jahren 0
Ja das ist, was ich meinte. Sie sollten es in der Lage sein, es wieder auf die ursprüngliche Größe zu verkleinern, wenn Sie es mit der Windows-API platzieren. martineau vor 9 Jahren 0
@martineau: Ich habe versucht, es auf 200 x 200 zu skalieren, hatte aber keinen Erfolg. Dann habe ich versucht, es auf 800 x 800 zu skalieren, aber erneut ist es fehlgeschlagen. Schließlich habe ich mit 600 x 600 versucht, aber wieder kein Glück ... Ich ging zu * Object-> Transform * und wählte * Scale * aus dem Dialogfeld in Inkscape. Ich habe es sogar mit * auf jedes Objekt einzeln angewendet * Option versucht, aber es hat mir auch nicht geholfen ... Vielleicht mache ich etwas falsch. Können Sie versuchen, das zu tun, was Sie mit der SVG vorschlagen, mit der ich in meinem Post verlinkt habe? Vielen Dank. AlwaysLearningNewStuff vor 9 Jahren 0
Was meinst du mit "hatte keinen Erfolg" und "es ist fehlgeschlagen"? Nachdem Sie das alles mit der SVG-Datei gemacht haben, exportieren Sie es erneut und versuchen Sie es erneut mit WinAPI und C ++. martineau vor 9 Jahren 0
@martineau: * Was meinst du mit "hatte keinen Erfolg" und "es ist fehlgeschlagen"? * -> die Qualität des Bildes ist gleich geblieben. * Nachdem Sie das alles in der SVG-Datei getan haben, exportieren Sie es erneut, und versuchen Sie erneut, mit WinAPI und C ++ darauf zuzugreifen. * Nachdem Sie das Bild hochskaliert haben, klicken Sie auf * Speichern *, um die Änderungen zu speichern, und dann auf * Speichern unter * und Speichern Sie es als EMF. Die Bildqualität bleibt unverändert. ** Das habe ich auch bemerkt, wenn der Explorer das Bild anzeigt. Inkscape warnte, dass beim Schließen des Programms einige Details verloren gehen könnten, und bat um das Speichern als SVG anstelle von EMF. ** Möglicherweise ist der letzte Teil wichtig? AlwaysLearningNewStuff vor 9 Jahren 0
Es ist durchaus möglich, dass beim Speichern der Datei als EMF-Datei diese in ein Bild konvertiert wird. EMF-Dateien können eingebettete Rasterbilder sowie Vektorgrafiken enthalten. Für höchste Qualität und Konsistenz empfehle ich Ihnen, die Original-SVG-Grafiken zu verwenden, anstatt sie zu konvertieren. martineau vor 9 Jahren 0
Nur ein Unterschied zwischen dem mitgelieferten SVG und dem EMF fiel mir auf: In der ersten Version haben Sie keine schwarzen Umrisse von z. B. den weißen Wellen, sondern in der zweiten. Diese Gliederung wird nicht verkleinert, wodurch Ihre EML in kleinen Maßstäben durcheinander gebracht wird. Da ich nicht ganz sicher bin, sprechen wir über dasselbe Problem (einige Grafiken in Ihrer Frage wären hilfreich). Bitte überprüfen Sie meine bearbeitete EMF-Datei: http://www.speedyshare.com/zBS7q/test-mod. emf - Wenn das gut aussieht, können Sie vielleicht eine Inkscape-Exportoption bezüglich der Gliederung finden (ich weiß nicht, Inkscape ... Ich habe CorelDRAW verwendet, um diese Datei zu erstellen). mpy vor 9 Jahren 0
@mpy: Ich habe deine EMF überprüft und das gleiche Ergebnis erhalten. Wenn Sie bitte etwas Geduld haben, programmiere ich eine kleine Anwendung, die Ihnen beim Testen hilft und sie hochlädt. Ich werde meinen Beitrag mit dem Link für diese Anwendung bearbeiten und Sie benachrichtigen. Vielen Dank für den Versuch zu helfen, ich weiß es zu schätzen! AlwaysLearningNewStuff vor 9 Jahren 0
Wäre es nicht einfacher, nur zwei Bilder zu posten (gewünschtes Ergebnis und Ergebnis aus Ihrem Code)? mpy vor 9 Jahren 0
@mpy: Fertig! Siehe meinen bearbeiteten Beitrag für den Link. Vergessen Sie nicht, einfache Anweisungen zu befolgen, damit alles einwandfrei funktionieren kann. AlwaysLearningNewStuff vor 9 Jahren 0
(Ihr Link zum EMF-Viewer-Programm ist schlecht.) Ich stimme zu, dass mit Ihrem EMF nichts falsch ist. Bei der Anzeige mit Photoshop hat der EMF keinen hinzugefügten Rahmen. Dies scheint also ein Problem mit Ihrem Viewer zu sein. harrymc vor 9 Jahren 0
@ harrymc: * Ihr Link zum EMF-Viewer-Programm ist schlecht. * Ich verstehe nicht, haben Sie auf "Download: EMF app.rar" geklickt, nur über 5 gelben Sternen? Haben Sie die EMF-Datei und das Programm an derselben Stelle aufbewahrt, z. B. im selben Verzeichnis? * Bei der Anzeige mit Photoshop hat der EMF keinen zusätzlichen Rahmen, daher scheint dies ein Problem mit Ihrem Viewer zu sein. * Ich verstehe diesen Teil nicht, aber ich glaube Ihnen. Kannst du erklären, was du meinst (wenn es natürlich nicht zu breit ist)? Vielen Dank. AlwaysLearningNewStuff vor 9 Jahren 0
Ich denke, das war eine momentane Panne mit der Sharing-Site, der Link funktioniert jetzt einwandfrei. harrymc vor 9 Jahren 1
@ harrymc: OK, kein Problem. Es scheint, dass die Antwort unten etwas nützliches Licht wirft. Ich verwende natives `GDI` und es verwendet wahrscheinlich einen einfachen Skalierungsalgorithmus. Ich verstehe einfach nicht, warum ich einen Resampling-Algorithmus brauche, wenn EMF das Vektorformat ist ... AlwaysLearningNewStuff vor 9 Jahren 0

2 Antworten auf die Frage

2
mpy

Ich vergleiche mit Ihrer Testgrafik:

  1. Dies ist die PNG-Datei, die Sie bereitstellen, daher ist dies wahrscheinlich das gewünschte Ergebnis:

    enter image description here

  2. Die Ausgabe Ihres Codes, ca. bei gleicher Größe:

    enter image description here

  3. Die von Ihnen bereitgestellte EMF-Datei wird in IrfanView angezeigt (wieder etwa gleich groß)

    enter image description here

  4. Wie 3., aber mit View -> Display Options -> Use Resampleeingeschaltetem:

    enter image description here

Fazit

Wie 4. ähnlich aussehen (dh das gewünschte Ergebnis), ist meine Schlussfolgerung, dass die Konvertierung in das EMF-Format einwandfrei ist. Ihr Code skaliert die Grafik jedoch mit einem einfachen, wahrscheinlich pixelbasierten Algorithmus. IMHO müssen Sie z. B. eine bilineare Interpolationsroutine implementieren .

Ich habe Ihre Antwort bestätigt, denn es scheint mir, als hätten Sie das Problem und eine Lösung gefunden. Trotzdem bin ich ein wenig ratlos. Sollte EMF nicht das Vektorformat sein, was bedeutet, dass Sie bei der Neuskalierung nicht an Qualität verlieren? AlwaysLearningNewStuff vor 9 Jahren 0
IrfanView kann EMF nur sehr schlecht anzeigen. Ich habe es auch ausprobiert und es tut schreckliche Dinge. Ich denke, es konvertiert den EMF in ein kleines Bitmap und zeigt ihn vergrößert an, was zu einer Pixelation führt. Das Bild-Resample gilt nur für Bitmap-Bilder, niemals für Vektorgrafiken, die in jeder Größe korrekt angezeigt werden sollten. harrymc vor 9 Jahren 0
@ harrymc: Ich stimme mit deinen Anmerkungen überein, aber meine App macht das Gleiche (Ausführen und Prüfen). Dies ist in der Tat sehr merkwürdig. Ich bin wirklich dumbstruck und werde eine Frage dazu auf * StackOverflow * stellen, nur um zu sehen, was los ist. In der Zwischenzeit möchte ich Sie bitten, SVG-Dateien mit Adobe Illustrator oder Photoshop in EMF-Dateien zu konvertieren, nur um zu sehen, wie sich meine App verhält. Es gibt mir nützliche Informationen für Leute bei * StackOverflow *. Vielen Dank. AlwaysLearningNewStuff vor 9 Jahren 0
Kannst du das auch versuchen? SVG mit Adobe Illustrator oder etwas anderem in EMF konvertieren und mit meiner App testen? Vielen Dank. AlwaysLearningNewStuff vor 9 Jahren 0
2
harrymc

Bei der Anzeige mit Photoshop verfügt der EMF nicht über einen hinzugefügten Rahmen. Dies scheint also ein Problem mit dem Viewer zu sein.

Ich kann Ihren Viewer aus irgendeinem dunklen Grund nicht herunterladen. Ich habe den Free WMF Viewer verwendet, um Ihr EMF-Bild anzuzeigen.

Die EMF-Datei sieht perfekt aus - sie skaliert perfekt wie ein Vektorgrafik-Bild. Dieser Betrachter zeigt jedoch auch einen schwarzen Rahmen um das Bild.

Ich habe Ihren EMF auch mit einem alten WMF / EMF-Viewer betrachtet, den ich einmal geschrieben habe, der auch nicht den schwarzen Rahmen zeigt. Ich stelle fest, dass ich in meinem eigenen Betrachter den Begrenzungsrahmen nur verwendet habe, um das Seitenverhältnis des Bildes (Höhe vs. Breite) zu bestimmen, um es korrekt anzuzeigen, dh nicht gestaucht oder gestaucht.

Meine Schlussfolgerung ist, dass beide Betrachter den Begrenzungsrahmen als Rahmen anzeigen. Dies ist falsch, da der Zweck darin besteht, Informationen zum empfohlenen Anzeigerechteck des Bildes zu geben und nicht angezeigt zu werden. Ihr Prozess zur Erzeugung des EMF scheint daher korrekt zu sein.

Ich habe Ihren Beitrag befürwortet, weil ich auf der Website von Inkscape dokumentierte Probleme mit EMF gefunden habe (ich kann mich jetzt nicht an den Link erinnern). Sie sagen im Grunde, dass SVG "einfach" sein muss (solide füllt einfache Striche und ähnliches), andernfalls wird es Probleme geben. Wenn ich Sie in meinem Kommentar zur Antwort von member * mpy's * gefragt habe, können Sie die von mir in EMF hochgeladene SVG-Datei mit Illustrator konvertieren und mit meiner App überprüfen? Vielen Dank. AlwaysLearningNewStuff vor 9 Jahren 0
Illustrator kann das SVG-Format anzeigen, aber meine Version kann nicht im EMF-Format speichern. Ich stelle fest, dass ein anderer Bildmaler vor der Anzeige des SVG nach der Größe gefragt hat, ob nach einer bestimmten Größe oder nach der Größe des Begrenzungsrahmens (dh des Betrachtungsrechtecks) angezeigt werden soll. Ich denke, dass diese Begrenzungsbox in der SVG von Inkscape schlecht in EMF übersetzt wird. harrymc vor 9 Jahren 0
Ich schätze deine Bemühungen. SVG wurde mit Inkscape durch Konvertieren der Corel Draw-Datei erstellt. Wenn ich ein anderes Tool zum Erstellen von SVG-Fehlern verwende, wird es möglicherweise verschwinden. In meiner Hauptanwendung zeige ich EMF aus einem anderen Programm (ArcGis) und alles funktioniert gut. Ich hoffe nur, dass dies ein Fehler mit Inkscape ist und kein größeres Problem, das ich lösen muss. Danke, wir werden bald wieder "reden". AlwaysLearningNewStuff vor 9 Jahren 0
Ich habe einen alten WMF / EMF-Viewer ausprobiert, den ich einmal geschrieben habe, und er zeigt auch nicht den schwarzen Rahmen. Ich stelle fest, dass ich den Begrenzungsrahmen nur verwendet habe, um das Seitenverhältnis des Bildes zu bestimmen (Höhe vs. Breite), damit das Bild korrekt angezeigt wird. Ich denke immer noch, dass die Zuschauer, die es anzeigen, dieses Feld falsch interpretieren, da es nicht dazu bestimmt ist, es anzuzeigen. harrymc vor 9 Jahren 0
Ich habe Adobe Illustrator (Testversion) heruntergeladen und die Original-EPS-Datei im EMF-Format exportiert. Das Ergebnis blieb gleich. Bei StackOverflow um Hilfe gebeten, erhielt ich eine Antwort, mit der die Datei bearbeitet wurde, bevor sie angezeigt wurde. Dies bedeutet, dass das Problem in der Art liegt, wie mein Framework die Datei ausgibt. Daher habe ich mich entschlossen, die andere Antwort zu akzeptieren (ich habe Ihre bereits früher angehört). Vielen Dank für Ihre Zeit und Hilfe, ich schätze es sehr. AlwaysLearningNewStuff vor 9 Jahren 0