2009-11-23 10 views
7

Gibt es eine Möglichkeit, eine EMF-Metadatei (exportiert von einem Zeichenwerkzeug) mit aktiviertem Antialiasing zu zeichnen? Die Tools, die ich ausprobiert habe, sind nicht in der Lage, EMF-Dateien zu exportieren, daher habe ich mich gefragt, ob ich sie manuell wieder aktivieren kann, wenn ich die Emf in der OnPaint-Überschreibung meiner Controls zeichne.Zeichnen emf antialiased

Wenn jemand bestätigen kann, dass technisch möglich ist, antialiased EMF-Dateien zu generieren, wäre eine andere Lösung, ein Zeichenprogramm zu verwenden, das in antialiased EMF exportieren kann, oder einen Konverter von Dritt-Anbietern später tun. Wenn jemand solch ein Werkzeug kennt, lass es mich wissen.

EDIT: Beim Betrachten der emf instructions scheint es nicht, dass EMF selbst die Information tatsächlich speichern kann, ob es antialiased gerendert werden soll oder nicht. Zumindest konnte ich nichts finden. Es ist wahrscheinlicher, dass das Antialiasing von der Wiedergabemaschine ausgeführt wird. Zum Beispiel, wenn ich eine EMF in Word 2007 öffne, wird es antialiased gerendert. Aber nicht wenn ich es mit GDI + "Playback Engine" zeichne (Graphics.DrawImage(...)). oder wenn ich es den Standard Windows Image Viewer betrachte. Das lässt mich glauben, dass einige Werkzeuge tatsächlich ihre eigene emf-Wiedergabe-Engine haben. Vielleicht gibt es also eine kostenlose .NET-Bibliothek (vorzugsweise mit Quellcode), die mir ein Objektmodell der in der geparsten EMF-Datei gespeicherten emf-Anweisungen liefert, so dass ich es selbst abspielen kann, anstatt Graphics.DrawImage(...) zu verwenden?

+2

Wenn alles andere fehlschlägt, können Sie es wahrscheinlich mit der vierfachen Größe oder so zeichnen und dann Downsample. – Joey

+0

Ich habe das versucht, bei kleinen Größen sieht das immer noch hässlich aus Auch mit diesem Ansatz gibt es wahrscheinlich einen hässlichen Speicheraufwand. (Ich werde viele solcher UserControls auf einmal anzeigen). – bitbonk

+0

Duplizieren: http://stackoverflow.com/questions/1422949/emf-with-forced-antialiasing – liori

Antwort

9

Wir hatten ein ähnliches Problem in einem DirectX-Projekt. Upscaling und Downscaling funktionieren bis zu einem gewissen Grad, aber es täuscht es vor. Wenn es etwas ist, was Sie immer wieder tun müssen, könnten Sie die Datensätze der WMF analysieren und sie mit GDI + antialiased zeichnen.

Die folgenden Themen wieder das oben (aber sie sind aus dem Jahr 2005, so könnten die Dinge geändert haben):

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:]

Diese drei Programme könnte machen Sie den Job für Sie: Ich nehme an, Sie sind in Ordnung mit der Hand es tun:

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:]

Nun, hier ist ein Programm, das Ihnen eine EMF auf verschiedene Weise prüfen lassen:

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

... und hier ist eine Freeware Bibliothek, mit der Sie 122 der EMF-Befehle analysieren und in GDI + ausgeben können. Das sollte wahrscheinlich den Trick:

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

... oh, und Bekanntmachung auch # 3 auf der Seite Codeproject kommentieren. Sieht so aus, als hätte jemand vorher ihre Köpfe gegen die Wand geschlagen. Hoffe das löst dein Problem.

+0

Diese Programme scheinen es nur in andere Dateiformate zu konvertieren. Wir wählten EMF, um die Vektorgrafiken anzuzeigen, da dies das einzige Vektorformat ist, mit dem GDI + umgehen kann. Wir müssen die Kunst aus dem Code (daher GDI +) zeichnen, weil wir sie zur Laufzeit dynamisch verändern und animieren. Auch das Anzeigen von EMK mit GDI + ist wahrscheinlich die CPU- und speicherfreundlichste Art, Vektorgrafiken anzuzeigen. Unter Verwendung eines anderen Formats scheint EMF einfach nicht hilfreich zu sein. Eine coole Lösung wäre ein Vectorgrafik (beliebiges Format) zu C# GDI + -Instruktionskonverter. – bitbonk

+0

Warum verwenden Sie in diesem Fall nicht ein Zeichensystem mit beibehaltenem Modus und verzichten auf EMF? Theoretisch könnten Sie die EMF-Bilder speichern und eine benutzerdefinierte Bibliothek verwenden, um jede Form zu extrahieren und sie erneut mit GDI (+) zu zeichnen. Nach Ihrer Beschreibung des Problems hätte ich jedoch ein proprietäres Format erstellt, das * die Bilder mit Objekten * beschreibt * und dann auf die betreffende Oberfläche rendert. Ein anderer Ansatz könnte sein, swf zu verwenden, das viel besser unterstützt, gut dokumentiert und IMO vielseitiger ist. – Pedery

+0

Wir können kein proprietäres Format verwenden, da wir die Kunst mit einer gemeinsamen Zeichen-Software (Illustrator, Inkscape, Coreldraw ... einer davon) zeichnen müssen. – bitbonk

4

EMF verwendet GDI-Befehle, nicht GDI +, daher hat es keine Antialiasing-Funktion. Ich vermute, dass wenn Sie GDI + bitten, die Datei zu rendern, es an GDI sendet und nur die resultierende Bitmap kopiert.

Duplizieren in Code wäre das gleiche wie Reimplementierung GDI, so ist es nicht schrecklich machbar. Nicht unmöglich, nur eine größere Arbeit als der Nutzen würde rechtfertigen. Wenn es ein Open-Source-Dienstprogramm gibt, das EMF-Dateien außerhalb von Windows öffnen kann, können Sie sich den Quellcode ansehen.

Meine Vermutung ist, dass Word den Downsampling-Trick verwendet.

3

EMF-Datei ist eine Liste von GDI-Befehlen. Es wird also nicht anti-aliasiert, selbst wenn Sie unter GDI + einen SmoothingMode() - Aufruf vor die Zeichnung setzen. Sie müssen die GDI-Befehle aufzählen und dann in GDI + -Befehle übersetzen.

Unter Vista/Seven können Sie die GDI + 1.1-Funktion GdipConvertToEmfPlus/ConvertToEmfPlus verwenden. Wenn Sie möchten, dass Ihr Programm mit XP arbeitet, sollten Sie Ihre eigene Enumeration und dann die Konvertierung in GDI + -Befehle schreiben.

Die GDI-Enumeration dann Umwandlung in GDI + ist möglich wurde von emfexplorer getan, aber ich habe some code perhaps more easy to follow geschrieben, auch wenn es in Delphi geschrieben ist.

Ich setze diese Antwort gerade jetzt (ich bin spät), weil ich viel Zeit damit verbracht habe, eine Lösung mit ConvertToEmfPlus zu finden und etwas optimierten Quellcode zu schreiben, falls diese Methode nicht verfügbar ist.

Verwandte Themen