2012-08-23 18 views
6

Tengo un archivo EMF. Quiero redimensionarlo más pequeño.¿Cómo cambio el tamaño (contracción) de un EMF (Metarchivo) en .Net?

¿Cómo hago esto en .net (o con cualquier herramienta) sin obtener una imagen borrosa?

La imagen redimensionada resultante se convertirá a otro formato (png/jpg/lo que sea), puedo manejar eso (creo).

No he encontrado un ejemplo claro en .Net (o en cualquier plataforma de idiomas sobre el tema) que se ocupe de fem/metarchivos.

He buscado en la programación de gráficos con GDI + pero solo presenta metarchivos.

He intentado Image Magick pero tienes que convertir a otro formato (que de todos modos tengo que hacer) y el resultado es borroso (cuando se encoge y se convierte a png por ejemplo).

He intentado con Inkscape, pero solo puede importar un archivo EMF e Inkscape lo importa boca abajo y desproporcionado en un dibujo existente.

Además, (no se ría) Lo abrí en Window's Paint (uno de los pocos programas de software de edición de imágenes que abrirán fem) y redimensioné el dibujo, de nuevo está borroso.

Actualización: Aquí está el código que estoy usando para cambiar el tamaño.

Esto funciona, pero la imagen resultante es borrosa. El código es sólo una rutina imagen de redimensionamiento genérico, no específico para EMF

private static Image resizeImage(Image imgToResize, Size size) 
{ 
    int sourceWidth = imgToResize.Width; 
    int sourceHeight = imgToResize.Height; 

    float nPercent = 0; 
    float nPercentW = 0; 
    float nPercentH = 0; 

    nPercentW = ((float)size.Width/(float)sourceWidth); 
    nPercentH = ((float)size.Height/(float)sourceHeight); 

    if (nPercentH < nPercentW) 
     nPercent = nPercentH; 
    else 
     nPercent = nPercentW; 

    int destWidth = (int)(sourceWidth * nPercent); 
    int destHeight = (int)(sourceHeight * nPercent); 

    Bitmap b = new Bitmap(destWidth, destHeight); 
    Graphics g = Graphics.FromImage((Image)b); 
    g.InterpolationMode = InterpolationMode.HighQualityBicubic; 

    g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); 
    g.Dispose(); 

    return (Image)b; 
} 

Fuente: http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing

+0

Iba a preguntar dónde estás dibujando el CEM. Pero, lo que acaba de publicar Magnus debe cubrir todo lo que quieras hacer. –

Respuesta

5

Im usando el siguiente código (similar a lo que se tiene después de la edición) para la modificación del tamaño una imagen de fem. No parece ser borroso.

var size = new Size(1000, 1000); 

using(var source = new Metafile("c:\\temp\\Month_Calendar.emf")) 
using(var target = new Bitmap(size.Width, size.Height)) 
using(var g = Graphics.FromImage(target)) 
{ 
    g.DrawImage(source, 0, 0, size.Width, size.Height); 
    target.Save("c:\\temp\\Month_Calendar.png", ImageFormat.Png); 
} 
+0

Magnus, sí, esto funciona bien para aumentar el tamaño. Sin embargo, cuando lo reduzca (disminuya el tamaño), obtendrá una imagen borrosa. Compare esto para cargar un EMF en Word o Visio. Puede reducir la imagen sin una gran pérdida de calidad. Cuando haces lo mismo con tu método (o mi método anterior) pierdes calidad. –

+0

@ChrisWeber, podría considerar usar la [Biblioteca MFRasterizer] (http://wmf.wholegroup.com/) – Magnus

+1

Resulta que esta calidad es lo suficientemente buena para mis propósitos. El código en mi pregunta funciona para mí porque mantiene la imagen en proporción. –

1

.Net puede cargar y extraer los Campos Electromagnéticos:

Metafile myMetafile = new Metafile("SampleMetafile.emf"); 
graphics.DrawImage(myMetafile, 100, 100); 

Si la imagen resultante es borrosa, considere guardar como PNG/GIF que tiene una compresión sin pérdida, o hacer a una imagen más grande.

Si el resultado aún no es lo suficientemente bueno, entonces necesita usar GDI32 para cargar y renderizar.

+0

Puedo cargarlo bien. El problema es cambiar el tamaño. –

+1

Hay tres causas de borrosidad: 1) tamaño de imagen, 2) compresión de imagen, 3) representación. Cuando GDI + rinde EMF, se procesa con renderización anti-aliaising, lo que podría causar confusión. –

0

El cambio de tamaño de los campos electromagnéticos puede ser bastante complicado. Puede rasterizar la imagen en un mapa de bits más pequeño, pero los resultados no siempre son los esperados. Estos son los resultados de unas estrategias de visualización:

3 different strategies

para mi propio proyecto, decidí utilizar la última estrategia: la voladura de la FEM en un mapa de bits 4x el tamaño de la FEM, guardándolo en PNG y luego guardando el PNG en un archivo más pequeño.

He escrito un blog sobre el tema: Rasterizing EMF files with .Net/C#. Y he creado un class on GitHub que ayuda a cambiar el tamaño de los campos electromagnéticos, pero es una forma un poco más complicada de hacer las cosas (con un cuadro delimitador).

Cuestiones relacionadas