Как мы конвертируем WMF / EMF (метафайлы MS) в стандартные изображения, такие как JPG или PNG, используя любой API Java? - PullRequest
5 голосов
/ 22 июля 2011

Я застрял в преобразовании изображений WMF / EMF в стандартный формат изображения, такой как JPG или PNG, с использованием Java.

Каковы наилучшие доступные варианты?

Ответы [ 5 ]

2 голосов
/ 22 июля 2011

Библиотека Batik - это набор инструментов для обработки SVG в Java.Есть конвертеры, такие как WMFTranscoder для преобразования из WMF в SVG и JPEGTranscoder и PNGTranscoder для преобразования SVG в JPEG / PNG.Подробнее см. Документы Transcoder API .

Другой альтернативой является ImageMagick .Это не Java, но имеет привязки Java: im4java и JMagick .

1 голос
/ 11 декабря 2013

Если вы развертываете свое приложение в среде Windows, тогда SWT может обработать преобразование за вас.

    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();

Цель SWT состоит в том, чтобы предоставить Java-оболочку для нативной функциональности, и в этом случае он вызывает GDI для Windows напрямую, чтобы заставить его отображать WMF.

1 голос
/ 26 июня 2013

wmf - векторный формат файла. Для достижения наилучших результатов конвертируйте их в формат .svg или .pdf. Я сделал это в два этапа

1) wmf2fig --auto XXXX.wmf

2) fig2pdf --nogv XXXX.fig

Я создал скрипт Python для массового преобразования

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 голосов
/ 27 июня 2013

Некоторое время назад я создал несколько оберток вокруг пакета Batik (как упомянуто ответом vanje ), который обеспечивает поддержку ImageIO для SGV и WMF / EMF.

С помощью этих плагиноввы должны быть в состоянии написать:

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

Исходный код на GitHub .

Хотя плагины ImageIO удобны, im4java и JMagick могут по-прежнему иметь лучшую поддержку форматирования.

0 голосов
/ 22 июля 2011

Вот один из способов.

  1. Получите (или создайте) компонент Java, который может визуализировать рассматриваемые файлы.
  2. Создайте BufferedImage того же размера, который необходим компоненту для отображения изображения.
  3. Получить объект Graphics из BufferedImage.
  4. Звоните renderComponent.paintComponent(Graphics)
  5. Сохраните изображение, используя один из ImageIO.write() вариантов.

См. Мой ответ на Swing: Получить изображение JFrame для шагов 2-5. Шаг 1. это то, о чем я хотел бы спросить Google.

...