ImageMagickでEPSを画像に変換したときの色化け

とりあえず何の変哲もないコマンド

convert sample.eps sample.png


シンプルなEPSならなんら問題なく画像になるのだけれど、グラデーションの場合に問題が発生する。
若干輝度が高くなってしまうのだ。
塗りとグラデーションが混在している場合、塗りは問題なく色が出るけれど、グラデーションは明るめに色が出てしまう。
これはどうやって回避すればいいのだろう・・・

ImageMagickで文字を描画する

このページは、Text Handingを基準に作成されていますが、
翻訳ページではありませんので、ご注意ください。
captionでも作成できますが、とりあえず保留します。
また、コード内において改行が含まれていますが、実際には改行を含まずに入力することが必要です。
サンプルで使用したフォントはあくあフォントです。

オプションの説明

文字については、フォントが持っている幅が利用されるため、余白が生まれます。
-trim“オプションを利用すれば、出来るだけ小さな画像にすることは出来ますが、
座標で決め打ちするような画像の合成時に、誤差の原因となる可能性があるため、利用は控えたほうがいいかもしれません。

オプション 内容 細く
-background 背景の色 指定しない場合は白色になり、透明情報を持てる形式で出力する場合には「none」を指定すれば透明になる。
-fill 文字の色 文字の色を指定しなければ、背景で塗られた画像が作成される。
ただし、画像サイズは文字の色を指定したときと同じものになる。
-pointsize 文字の大きさ
(pt)
文字の大きさを指定しなくても、画像サイズが指定されていれば自動で調整されるが、
画像サイズが指定されていなければ、おそらく12ptで作成されているらしい。

文字サイズを基準に描画する

画像サイズは自動的に調整されます。

convert -background white -fill blue 
	-font aquafont.ttf -pointsize 32 label:penlabo.net text1.png
文字サイズ基準画像

png画像、176×34ピクセル

画像サイズを基準に描画する

縦と横のサイズを指定する

文字サイズは自動的に調整されますが、余白が出来ます。
この余白を調整するには”-gravity“オプションを設定します。

convert -background white -fill blue 
	-font aquafont.ttf -size 256x64 label:penlabo.net text2.png

画像サイズ基準画像

png画像、256×64ピクセル

横のサイズを指定する

文字サイズは自動的に調整されますが、余白が出来ます。
横のサイズのみを指定することにより、縦は自動で調整されます。

convert -background white -fill blue 
	-font aquafont.ttf -size 256x label:penlabo.net text3.png

画像サイズ横基準画像

png画像、256×47ピクセル

縦のサイズを指定する

文字サイズは自動的に調整されますが、余白が出来ます。
縦のサイズのみを指定することにより、横は自動で調整されます。

convert -background white -fill blue 
	-font aquafont.ttf -size x64 label:penlabo.net text4.png

画像サイズ縦基準画像

png画像、336×64ピクセル

改行を含む文字描画する

文字列に「\n」を含めれば、改行コードも利用できます。

convert -background white -fill blue 
	-font aquafont.ttf -pointsize 32 label:penlabo\n.net text5.png

画像サイズ改行有り画像

png画像、113×67ピクセル

日本語を描画する

テキストファイルを指定すれば、日本語も画像に出来ます。
ただし、文字コードは「UTF-8」で保存する必要がありますが、BOMの有り無しは関係ないようです。
改行も有効なので、スクリプトから画像を作成する際には便利です。

convert -background white -fill blue 
	-font aquafont.ttf -pointsize 32 label:@text6.txt text6.png

画像サイズ縦基準画像

png画像、126×34ピクセル

画像の中の指定した場所に文字描画する

-annotate“オプションを利用することで、文字を自由に配置できますが、
画像のx座標と座標だけでは、思い通りになりません。
フォントの持つ特性を理解しなければならならず、ちょっとした工夫が必要となります。

とりあえず、何も考えずに座標(0,0)を指定してみましょう。

convert -size 256x64 xc:white -fill blue 
	-font aquafont.ttf -pointsize 32 
	-annotate +0+0 penlabo.net annotate1.png

座標0,0画像

png画像、256×64ピクセル

とても悲惨な画像が作成されました。
上部になにやら見えていますが、これでは何一つ判りません。
次は試しにy座標の値を、画像の高さと同じに変更してみましょう。

convert -size 256x64 xc:white -fill blue 
	-font aquafont.ttf -pointsize 32 
	-annotate +0+64 penlabo.net annotate2.png
座標0,64画像

png画像、256×64ピクセル

今度は、どういう文字が書いてあるのかが判るようになりましたが、今度は下部が切れてしまいました。
2つの画像を見比べると、上下につなぎ合わせれば1つの画像になることが判ります。

座標0,0画像←画像2つ目
座標0,64画像←画像1つ目

-annotate“でy座標を指定するときには、フォントのベースラインを基準にしなければならないのです。
-font“、”-poinsize“を基準に求めたベースラインの座標を指定しなければ、思うように配置が出来ないのです。

いろいろ調べましたが、ベースラインの座標を求める方法が見つかりませんでした。
もし、ご存知の方がいらっしゃいましたら、ご教授をお願いいたします。
次の方法を取れば、画像を作ってはそのサイズを求め・・・といった肯定を省くことが出来ます。
ベースラインの座標を求めるには、文字を基準に画像を作成し、余白を除去する”-trim”オプションを追加します。

convert -font aquafont.ttf -pointsize 32 
	label:penlabo.net -trim info:

背景や文字の色は、指定しなくても問題ありません。
ファイル名を”info:”と指定することで、画像ファイルではなく画像情報が出力されます。

label:penlabo.net LABEL 173x27 176x34+1+5 DirectClass 8-bit

この場合は27ピクセルとわかりました。

convert -size 256x34 xc:white -fill blue 
	-font aquafont.ttf -pointsize 32 
	-annotate +0+27 penlabo.net annotate3.png

これで、座標を指定して思い通りの場所に文字描画することができるようになりました。

更新履歴

2007-06-02
公開