私は、WMF/EMFイメージをJavaを使用してJPGやPNGなどの標準イメージ形式に変換しています。Java APIを使用して、WMF/EMF(MSメタファイル)をJPGやPNGなどの標準イメージに変換するにはどうすればよいですか?
利用可能な最良のオプションは何ですか?
私は、WMF/EMFイメージをJavaを使用してJPGやPNGなどの標準イメージ形式に変換しています。Java APIを使用して、WMF/EMF(MSメタファイル)をJPGやPNGなどの標準イメージに変換するにはどうすればよいですか?
利用可能な最良のオプションは何ですか?
これは片道です。
BufferedImage
を作成します。Graphics
オブジェクトを取得します。renderComponent.paintComponent(Graphics)
ImageIO.write()
のいずれかを使用して画像を保存します。ステップ2~5の回答はSwing: Obtain Image of JFrameです。ステップ1.私はGoogleに尋ねるものです。
私はコードの部分を表示することができます。私は理解することができます。私は問題のファイルから画像(java.awt.Image)を作成できませんでした。 BufferedImageを作成する際の問題が再び発生します。ご理解ください。 – pinkb
Batik libraryは、JavaでSVGを処理するためのツールキットです。 WMFからSVGに変換するためにWMFTranscoderのようなコンバータがあり、SVGをJPEG/PNGに変換するにはJPEGTranscoderとPNGTranscoderがあります。詳細はTranscoder API Docsを参照してください。
もう1つの方法はImageMagickです。 Javaではありませんが、Javaバインディングはim4javaとJMagickです。
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)二段階
をやりました
答えはJavaに関するものではありませんが、おそらく変換結果をベクトルとして保持するのが最も良いと私は同意します。 BatikはSVGに変換できます。 – haraldK
私は、SGVとWMF/EMFのImageIOサポートを提供するBatikパッケージ(vanje's answer)のラッパーを作成しました。これらのプラグインで
次のように記述することができるはずです。
ImageIO.write(ImageIO.read(wmfFile), pngFile, "png");
ソースコードGitHubに。
ImageIOプラグインは便利ですが、im4javaとJMagickのフォーマットサポートは改善されているかもしれません。
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を呼んでいます。
WMF/EMF画像を制作している人は、撃墜されるべきですが、それは価値があります。素晴らしいImageMagick *がWMFファイルを変換できることは確かです。以前は、ImageMagick用のJavaラッパー(メモリが使用されている場合はJMagickと呼ばれていました)もありました。だからそこを見ることができます。つまり、WMF/EMFはさまざまな形式の "シェル"または "ラッパー"なので、動くターゲットになる可能性があります。また、さまざまなWMF/EMFファイルがたくさんあります。これがまだ正しく処理されているかどうかは本当に分かりません。それは言ったことを働かせていました... – SyntaxT3rr0r