2009-11-23 12 views
7

¿Hay alguna manera de dibujar un metarchivo emf (exportado desde una herramienta de dibujo) con antialiasing activado? Las herramientas que probé no son capaces de exportar archivos emf con el mismo nombre, por lo que me pregunté si puedo volver a activarlo manualmente al dibujar la fem en la anulación de OnPaint de mis controles.Draw emf antialiased

Si alguien puede confirmar que es técnicamente posible generar archivos emf antialias, otra solución sería usar una herramienta de dibujo que pueda exportar a fem antialiased o hacer que un convertidor de terceros lo haga más tarde. Si alguien conoce una herramienta de este tipo, házmelo saber.

EDITAR: Al mirar el emf instructions, no parece que la fem en sí misma pueda almacenar la información, ya sea para que se muestre o no como antialias. Al menos no pude encontrar nada. Es más probable que el antialiasing sea realizado por el motor de reproducción. Por ejemplo, cuando abro una fem en Word 2007, se vuelve antialias. Pero no cuando lo dibujo con GDI + "motor de reproducción" (Graphics.DrawImage(...)). o cuando lo veo como el visor de imágenes estándar de Windows. Esto me hace creer que algunas herramientas realmente tienen su propio motor de reproducción fem. Entonces, ¿tal vez hay una libre biblioteca .NET (preferiblemente con código fuente) que me da un modelo de objeto de las instrucciones fem almacenadas en el archivo emf analizado para poder reproducirlo yo mismo en lugar de usar Graphics.DrawImage(...)?

+2

Si todo lo demás falla, probablemente pueda dibujarlo cuatro veces el tamaño y luego reducir la resolución. – Joey

+0

Intenté esto, en tamaños pequeños, esto todavía se ve feo. También con este enfoque existe una sobrecarga de memoria fea. (Mostraré muchos UserControls a la vez). – bitbonk

+0

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

Respuesta

9

Tuvimos un problema similar en un proyecto de DirectX. Escalar y reducir la escala funciona hasta cierto punto, pero lo está fingiendo. Si es algo que debe hacer una y otra vez, tal vez pueda analizar los registros de WMF y dibujarlos con GDI + antialias.

Los siguientes temas respaldar esto (pero que son de 2005 así que las cosas podrían haber cambiado):

http://www.dotnet247.com/247reference/msgs/28/144605.aspx

http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-sdk/1127/Graphics-DrawImage-metafile-no-antialiasing

[Editar:]

Estos tres programas podría hacer el trabajo por usted: supongo que está bien hacerlo a mano:

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

[Editar II:]

Bueno, aquí es un programa que le permitirá inspeccionar una FEM de varias maneras:

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

... y aquí hay un programa gratuito biblioteca que le permitirá analizar 122 de los comandos EMF y generarlos en GDI +. Esto probablemente se debe hacer el truco:

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

... ah, y aviso también comentar # 3 en la página CodeProject. Parece que alguien ha golpeado sus cabezas contra la pared antes. Espero que esto resuelva tu problema.

+0

Esos programas simplemente parecen convertirlo a otros formatos de archivo. Elegimos EMF para mostrar el arte vectorial porque este es el único formato vectorial que GDI + puede manejar. Necesitamos dibujar el arte del código (por lo tanto GDI +) porque lo modificamos dinámicamente en el tiempo de ejecución y lo animamos. También mostrar fem con GDI + es probablemente la forma más amigable con la CPU y la memoria para mostrar arte vectorial. Usar otro formato que emf simplemente no parece útil. Una buena solución sería tener un Vectorgrafik (cualquier formato) para el convertidor de C# GDI + instrructions. – bitbonk

+0

En ese caso, ¿por qué no usa un sistema de dibujo de modo retenido y omite EMF por completo? En teoría, podría almacenar las imágenes EMF y usar una biblioteca personalizada para extraer cada forma y dibujarlas nuevamente con GDI (+). Sin embargo, a partir de su descripción del problema, habría creado un formato exclusivo que * describa * las imágenes utilizando objetos, y luego lo renderice en cualquier superficie en cuestión. Un enfoque diferente podría ser usar swf, que es mucho mejor admitido, bien documentado y más versátil. – Pedery

+0

No podemos usar un formato propietario porque necesitamos dibujar el arte con un software de dibujo común (illustrator, inkscape, coreldraw ... uno de esos). – bitbonk

4

EMF usa comandos GDI, no GDI +, por lo que no tiene noción de antialiasing. Sospecho que cuando le pides a GDI + que represente el archivo, lo envía a GDI y simplemente copia el mapa de bits resultante.

Duplicar esto en el código sería lo mismo que reimplementar GDI, por lo que no es muy posible. No es imposible, solo un trabajo más grande que el beneficio justificaría. Si hay una utilidad de código abierto que puede abrir archivos EMF fuera de Windows, puede consultar el código fuente.

Supongo que Word usa el truco de reducción de resolución.

3

El archivo EMF es una lista de comandos GDI. Por lo tanto, no será antialiado, incluso si en GDI +, usted pone una llamada SmoothingMode() antes del sorteo. Tendrá que enumerar los comandos GDI y luego traducirlos a comandos GDI +.

Bajo Vista/Seven, puede usar la función GDI + 1.1 llamada GdipConvertToEmfPlus/ConvertToEmfPlus. Si desea que su programa funcione con XP, debe escribir su propia enumeración, luego la conversión a comandos GDI +.

La enumeración de GDI y la conversión a GDI + es posible ha sido hecho por emfexplorer, pero he escrito some code perhaps more easy to follow, incluso si está escrito en Delphi.

Estoy poniendo esta respuesta ahora (llego tarde), porque pasé mucho tiempo buscando una solución usando ConvertToEmfPlus, y escribiendo un código fuente abierto sintonizado en caso de que este método no esté disponible.

Cuestiones relacionadas