無駄な努力

論文に自作プログラムの可視化画像を掲載するのに,ものすごい無駄な努力をしてしまった…orz

  1. まず最初にBufferedImageを使って画像をJPEGで保存し,PhotoshopでEPSに変換した.しかし,問題が多く,まず最初のファイルサイズが8.5MB(爆)投稿システムのサイズ制限に引っかかるので,白黒化・画像縮小して3.5MB.しかも,図が細かいのにイメージとして縮小しているから,線が擦れてよく見えない.
  2. 次に印刷ダイアログからPSで保存できるんじゃない?と,Java Print Service APIを使ってみる.印刷ダイアログはJava独自のもので,一応ファイルへの保存機能もあるが,バグっていて保存できないorz
  3. Java Print Service APIをよく見なおすと,DocFlavor.BYTE_ARRAY.POSTSCRIPTを指定すればPSで保存できることに気が付く.しかし,これも少々曲者で,基本的に印刷用なので大きい画像の一部しか印字できない,EPSに必要なBoundingBox情報が付かないなどの問題がある.たぶん,PrintRequestAttributeSetにいろいろ指定すれば近いことができて,Acrobatを使えばBoundingBox情報を付けられるのだろうが,かなりめんどくさそう….
  4. ぐぐっているうちに,sourceforge.jp「EPS Graphics Library」を見つける.APIの変更に合わせてサンプルプログラムが更新されていないので,結局ソースを見ながら実装する.今の実装ではバッファフラッシュをプログラマが意識しないといけなくて,それを忘れると出力されるデータが壊れることに注意する必要がある.次のようなコードで簡単にEPS出力ができるのは嬉しい.
try {
	FileOutputStream fos = new FileOutputStream("foo.eps");
	Dimension d = viewer.getSize();
	EpsGraphics g = new EpsGraphics("foo.eps", fos, 0, 0, d.width, d.height, ColorMode.BLACK_AND_WHITE);
	viewer.paint(g);
	g.close(); // これを忘れるとデータが壊れる
	fos.close();
} catch (IOException ex) {
	ex.printStackTrace();
}

これでイメージでなくベクトル描画されるので図もきれいになったし,ファイルサイズも一気に700KB以下(爆)
他に,「jlibeps」というライブラリもあるようで,Debianのパッケージにもなっているようなので,こちらの方が世界的には一般的なのかな?
小手先でごまかそうとせずに,最初からEPSファイルの保存を考えていたら,もっと早く解決していたはず.論文の〆切も近いのに,そんなことばかりしてるなよ>自分…orz