2011-07-22 71 views
5

我一直堅持使用Java將WMF/EMF圖像轉換爲標準圖像格式,如JPG或PNG。我們如何使用任何Java API將WMF/EMF(MS元文件)轉換爲標準圖像,如JPG或PNG?

什麼是最好的選擇?

+3

產生WMF/EMF圖像的人應該被槍殺,但它的價值在於:我確信美妙的(和免費的)* ImageMagick *曾經能夠轉換WMF文件。也曾經是ImageMagick的Java包裝(如果內存服務,稱爲JMagick)。所以你可能想看看那裏。這就是說我記得WMF/EMF只是各種格式的「炮彈」或「包裝器」,所以它可能是一個移動的目標,並且很可能有很多不同的WMF/EMF文件,而我我真的不確定這是否仍然正確處理。它曾經工作,說...... – SyntaxT3rr0r

回答

0

這是一種方法。

  1. 獲取(或製作)可呈現相關文件的Java組件。
  2. 創建與組件需要顯示圖像相同尺寸的BufferedImage
  3. BufferedImage獲取Graphics對象。
  4. 致電renderComponent.paintComponent(Graphics)
  5. 使用ImageIO.write()變體之一保存圖像。

請參閱我對Swing: Obtain Image of JFrame的回答,以獲取步驟2-5。第一步是我要問Google的。

+0

可以告訴我一段代碼..所以我可以理解..我無法創建一個圖像(java.awt.Image)出有問題的文件。這再次引發了創建BufferedImage的問題。希望你明白。 – pinkb

1

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

儘管答案並不是關於Java,但我同意最好將轉換後的結果保留爲向量。 Batik將能夠轉換爲SVG。 – haraldK

0

我前段時間創建了一些蠟染包裝的包裝(如vanje's answer所述),該包裝爲SGV和WMF/EMF提供ImageIO支持。

有了這些插件,你應該能夠編寫:

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

的源代碼上GitHub

雖然ImageIO插件很方便,但im4java和JMagick可能仍然有更好的格式支持。

1

如果您在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包裝,在這種情況下,它調用Windows GDI直接得到它呈現WMF。

相關問題