2009年12月9日水曜日

FreeBSDでPerlMagick(その2)図と文字を描く

この投稿はFreeBSDでPerlMagick(その1)はじめにからの続きです。
また,FreeBSDでPerlMagick(その1)はじめにに目次があります。

(5) 新しい図のためのcanvasの準備

 PerlMagick で図を描くには,まず絵を描くキャンバスが必要になる。キャンバスを作る際の細かいテクニックについては,ImageMagick の使い方のサイトの中のcanvas creationに書いてある。PerlMagick用じゃなくて,Image Magick用で,かつ,英語だけど。
 とりあえずcanvasを作って図を描くには,以下のように指定した図を読み込んでから,処理をする(ここでは楕円(結果として円)を描いている)
use Image::Magick;

my $img = Image::Magick->new;
$img->Set(size=>'150x150');
$img->ReadImage('xc:white'); # 白地キャンパスの読込み
# ----------------------------------------
$img1->Draw(stroke=>'blue', strokewidth=>3,primitive=>'ellipse', fill=>'#444444', points=>'75,75,50,50,0,360');
# ----------------------------------------
binmode(STDOUT);
$img1->Write("png:test.png");
undef $img;
 ここではサイズを150x150ピクセルにして,白地のcanvasにしている。xc:white は一面が真っ白の図を表している。ここで,Drawは図を描くコマンドで,これについては次に書こう。また出力はpngにしてみた。canvasは他に,
$img->ReadImage('xc:none'); # 透明な canvas
$img->ReadImage('xc:black'); # 黒い canvas
$img->ReadImage('radial-gradient:'); # 白黒の円形のグラデーション
$img->ReadImage('gradient:yellow'); # 黄色〜黒のグラデーション
$img1->ReadImage('plasma:fractal'); # プラズマフラクタル模様
などがある。 詳しくはcanvas creationを読んでみて欲しい。
 注意が必要なのが「透明なcanvas」の場合jpegで出力すると「黒いcanvas」になってしまう。これはjpeg が透明をちゃんと扱えないためで,pngで出力すると確かに透明な背景となっているのがわかる。描いた図を写真などと合成する場合は気にしないでいい。最終結果の図や写真の背景は普通は透明にならないと思うので。
 以下に透明キャンバスの上に円を描いた場合の,pngとjpgの出力例を示そう。
pngの出力例:背景が透明jpgの出力例:背景が黒い

(6) 図を描く:Drawコマンド

 図を描くにはDraw コマンドを使う。例えば四角や楕円の描画は
# 四角の描画
$img->Draw(stroke=>'red', primitive=>'rectangle', fill=>'blue', points=>'20,20 1000,100');

# 楕円(円)の描画
$img->Draw(stroke=>'blue', primitive=>'ellipse', fill=>'#444444', points=>'150,150,100,100,0,360');
 などのように書けばよい。ここで,stroke は枠の線の色を表し,strokewidth=>10とすると枠線の幅を変えれる。primitive がどんな図を描くか,を表し,fill は内部の色を表している。points は目的とする図形を表す点であり,図形により必要な個数が違っている。PerlMagickのサイトでDrawコマンドのパラメータの一覧があるが,
primitive=>{point, line, rectangle, arc, ellipse, circle, path, polyline, polygon, 
            bezier, color, matte, text, @filename}, 
points=>string, 
method=>{Point, Replace, Floodfill, FillToBorder, Reset}, 
stroke=>color name, 
fill=>color name, 
font=>string, 
pointsize=>integer, 
strokewidth=>float, 
antialias=>{true, false}, 
bordercolor=>color name, 
x=>float, 
y=>float, 
dash-offset=>float, 
dash-pattern=>array of float values, 
affine=>array of float values, 
translate=>float, float, 
scale=>float, float, 
rotate=>float, 
skewX=>float, 
skewY=>float, 
interpolate=>{undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline}, 
kerning=>float, 
text=>string, 
vector-graphics=>string
のようにかなり多くあり,細かい意味がわからないものもある。 パラメータについては,Drawing on Imagesや,Image Magickのコマンドオプションの-drawの項を見て欲しい。 このブログのFreeBSDでPerlMagick(その4)図形の描画と画像の加工に具体例を載せているので,そちらも見て欲しい。

(7) 文字を描く:Label として読み込む方法

 PerlMagick を使う時に,キャンバスに文字を描きたいことも多いはず。そこで文字を描く方法について述べる。
 一つ目はLabel として読み込む方法である。ここではより一般的な例を示したいので,日本語の表示例を示そう。
use Image::Magick;
use Jcode;

my $img1 = Image::Magick->new;
$img1->Set(size=>'300x100'); $text='これはテストです'; $text = jcode($text)->utf8; $fontdir='/usr/local/share/font-sazanami/sazanami-gothic.ttf'; $img1->Set(pointsize=>24,font=>$fontdir);
$img1->Read("label:$text"); $img1->Write($newname); undef $img1;
Label として読み込む例。ポイントは,日本語の場合,utf8 に変換しないといけない。そのためにJcode.pm を用いている。Jcode.pm
/usr/ports/japanese/p5-Jcode/
からインストールしておく。
 フォントは直接指定しないといけない。特に日本語のフォントの場合,どのファイルを指定すればよくわからなかったので,上記の例ではportsからインストールしたものを直接指定してみた。どうもTrue Typeフォントでないといけないみたいな感じがする。今回は
/usr/ports/japanese/font-sazanami/
をインストールしたが,他にも同じ/usr/ports/japanese/にあるfont-std/や,font-ipa/font-kochi/なども使えるはず。また,windowsマシンが近くにあるなら,windowsの
C:\WINDOWS\Fonts
の中にあるフォントファイルをコピーする手もある。

(註)ここでは utf8 に変換しないといけないと書いたが,逆に euc にしないといけないことがあった。よくわからないので,うまくいかない時はいろいろやってみてください。

(8) Annotate を用いた文字の描画

次の例はAnnotateを用いる方法。具体的には以下の例を見て欲しい。今回は白地のキャンバスを用意してみた。日本語なのでLabelの時と同様にutf8 に変換している。また,フォントはwindowsの丸ゴシックをコピーして使ってみた。下記の例では同じディレクトリに丸ゴシックフォントのファイルを置いた場合である。
use Image::Magick;
use Jcode;

my $img1 = Image::Magick->new;
$img1->Set(size=>'300x100');
$img1->ReadImage('xc:white');
$text='これはテストです';
$text = jcode($text)->utf8;
$fontdir='./HGRSMP.TTF';
$color='blue';
$pointsize=24;

$img1->Annotate(text=>$text,geometry=>'+0+0',font=>$fontdir,fill=>$color,
                gravity=>'Center',pointsize=>$pointsize);

$img1->Write($newname);
undef $img1;
Annotate コマンドは,gravitygeometry で印字する場所を指定している。gravity はどの方向を基準にするかを示していて,
{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}
の中から一つ選ぶ。North ならキャンバスの上の中央が座標の原点となり,SouthWest なら左下が原点となる。geometry は原点からの座標であり,上の端に原点がある時はy 軸は下向きになる。Annotate にはまだ多くのパラメータがあるが,詳しくはPerlMagickのサイトAnnotateを検索してみて欲しい。

WindowsのFrench ScriptフォントWindowsのPalace Scriptフォント

(註)ここでは utf8 に変換しないといけないと書いたが,逆に euc にしないといけないことがあった。よくわからないので,うまくいかない時はいろいろやってみてください。

FreeBSDでPerlMagick(その3)画像の加工に続く

0 件のコメント: