2011-07-22 11 views
5

He estado atrapado en la conversión de imágenes WMF/EMF en formato de imagen estándar como JPG o PNG utilizando Java.¿Cómo convertimos WMF/EMF (metarchivos MS) en imágenes estándar como JPG o PNG utilizando cualquier API de Java?

¿Cuáles son las mejores opciones disponibles?

+3

personas que producen imágenes WMF/EMF deben ser asesinadas a tiros, pero por lo que vale: estoy seguro de que la maravillosa (y gratuita) * ImageMagick * solía ser capaz de convertir archivos WMF. También solía haber un contenedor Java para ImageMagick (llamado JMagick si la memoria se sirve). Así que es posible que desee buscar allí. Dicho esto, como recuerdo, WMF/EMF son solo "shells" o "wrappers" en una variedad de formatos, por lo que puede ser un objetivo móvil y es muy posible que haya un ** lote ** de diferentes archivos WMF/EMF y yo Realmente no estoy seguro de que esto todavía se resuelva correctamente. Solía ​​funcionar que decía ... – SyntaxT3rr0r

Respuesta

0

Aquí hay una manera.

  1. Obtenga (o cree) un componente de Java que pueda representar los archivos en cuestión.
  2. Cree un BufferedImage del mismo tamaño que el componente para mostrar la imagen.
  3. Obtiene el objeto Graphics del BufferedImage.
  4. llamada renderComponent.paintComponent(Graphics)
  5. Guardar la imagen utilizando uno de los ImageIO.write() variantes.

Ver mi respuesta a Swing: Obtain Image of JFrame para los pasos 2-5. El paso 1. es algo sobre lo que le preguntaría a Google.

+0

Puede mostrarme un fragmento de código ... Para que yo pueda entender ... No pude crear una imagen (java.awt.Image) fuera del archivo en cuestión. Lo cual nuevamente plantea un problema al crear BufferedImage. Espero que entiendas. – pinkb

1

wmf es un formato de archivo vectorial. Para obtener los mejores resultados, conviértalos al formato .svg o .pdf. lo hice en dos etapas

1) wmf2fig --auto XXXX.wmf

2) fig2pdf --nogv XXXX.fig

creé un script pitón para la conversión mayor

import subprocess as sbp 
a = sbp.Popen("ls *.wmf",shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE) 
filelist = a.communicate()[0].splitlines() 

for ele in filelist: 
    cmdarg = 'wmf2fig --auto '+ ele.rsplit('.',1)[0]+'.wmf' 
    a = sbp.Popen(cmdarg, shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE) 
    out = a.communicate() 

for ele in filelist: 
    cmdarg = 'fig2pdf --nogv '+ ele.rsplit('.',1)[0]+'.fig' 
    a = sbp.Popen(cmdarg, shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE) 
    out = a.communicate() 

cmdarg = 'rm *.fig' 
a = sbp.Popen(cmdarg, shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE) 
out = a.communicate() 
+0

Si bien la respuesta no es realmente sobre Java, estoy de acuerdo en que probablemente sea mejor mantener el resultado convertido como vector. Batik podrá convertir a SVG. – haraldK

0

He creado algunas envolturas alrededor del paquete Batik (como se menciona en vanje's answer) hace algún tiempo, que proporciona compatibilidad con ImageIO para SGV y WMF/EMF.

Con estos plugins que debe ser capaz de escribir: Código

ImageIO.write(ImageIO.read(wmfFile), pngFile, "png"); 

Fuente de GitHub.

Aunque los complementos ImageIO son convenientes, im4java y JMagick aún pueden tener un mejor soporte de formato.

1

Si está implementando su aplicación en un entorno Windows, entonces SWT puede manejar la conversión por usted.

Image image = new Image(Display.getCurrent(), "test.wmf");     
    ImageLoader loader = new ImageLoader(); 
    loader.data = new ImageData[] { image.getImageData() }; 
    try(FileOutputStream stream = new FileOutputStream("test.png")) 
    { 
     loader.save(stream, SWT.IMAGE_PNG); 
    } 
    image.dispose(); 

El propósito de SWT es proporcionar una envoltura alrededor de Java funcionalidad nativa, y en este caso se está llamando a la GDI de Windows directamente a conseguirlo para hacer que el WMF.