2011-07-22 49 views
5

私は、WMF/EMFイメージをJavaを使用して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. Graphicsオブジェクトを取得します。
  4. 電話renderComponent.paintComponent(Graphics)
  5. ImageIO.write()のいずれかを使用して画像を保存します。

ステップ2~5の回答はSwing: Obtain Image of JFrameです。ステップ1.私はGoogleに尋ねるものです。

+0

私はコードの部分を表示することができます。私は理解することができます。私は問題のファイルから画像(java.awt.Image)を作成できませんでした。 BufferedImageを作成する際の問題が再び発生します。ご理解ください。 – pinkb

1

wmfはベクトルファイル形式です。最良の結果を得るには、.svgまたは.pdf形式に変換してください。 私は一括変換のため

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() 
をPythonスクリプトを作成wmf2fig --auto XXXX.wmf

2)fig2pdf --nogv XXXX.fig)二段階

をやりました

+0

答えはJavaに関するものではありませんが、おそらく変換結果をベクトルとして保持するのが最も良いと私は同意します。 BatikはSVGに変換できます。 – haraldK

0

私は、SGVとWMF/EMFのImageIOサポートを提供するBatikパッケージ(vanje's answer)のラッパーを作成しました。これらのプラグインで

次のように記述することができるはずです。

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ラッパーを提供することであり、この場合には、WMFをレンダリングするために取得するために、直接窓GDIを呼んでいます。

関連する問題