2009年12月13日日曜日

FreeBSDでPerlMagick(その4)図形の描画と画像の加工

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

(15) Draw:図形の描画(その2)

 PerlMagick での図の描画の例をいつくか示そう。まずはline, rectangle, roundRectangle について書こう。それぞれの書式は以下のようになる。ちなみに,いずれの場合も 100 x 100 ピクセルのキャンバスの上に描画している。描画するための画像ファイルの読込み,あるいは新しいキャンバスを用意については,このブログのFreeBSDでPerlMagick(その1)はじめにFreeBSDでPerlMagick(その2)図と文字を描く を見て欲しい。
$img1->Draw(primitive=>'line', points=>'x0,y0 x1,y1', stroke=>$color, strokewidth=>$width);
$img1->Draw(primitive=>'rectangle', points=>'x0,y0 x1,y1', fill=>'green', 
stroke=>$color, strokewidth=>$width);
$img1->Draw(primitive=>'roundRectangle', points=>'x0,y0 x1,y1 wc,hc', fill=>'green', 
stroke=>$color, strokewidth=>$width);
line は始点と終点を,rectangle は対角線上の2点を, roundRectangle は対角線上の2点と角の丸みを指定する。点と点の間はスペースだが,コンマで区切っても大丈夫だった。stroke は線を表し,rectangleなら縁の線を表す。指定しなければ枠なしの図形となる。fill は塗りつぶしの色を表し,line で指定しても無視される。以下に具体例を示す。例4はスリット付きの角の丸い四角である。
例1:$img1->Draw(primitive=>'line', points=>'0,50 100,100', stroke=>'blue', strokewidth=>2);
例2:$img1->Draw(primitive=>'rectangle', points=>'0,50 100,100', fill=>'green');
例3:$img1->Draw(primitive=>'roundRectangle', points=>'0,50 100,100 10,10', fill=>'green');
例4:$img1->Draw(primitive=>'roundRectangle', points=>'0,25 100,75 10,10', fill=>'green');
   $img1->Draw(primitive=>'rectangle', points=>'45,0 55,100', stroke=>'none',  fill=>'white');

例1:line例2:rectangle例3:roundRectagle例4:roundRectagle
with slit

 次にarc, ellipse, circle について書く。それぞれの書式は以下のようになる。
$img1->Draw(primitive=>'arc', points=>'x0,y0 x1,y1 a0,a1', stroke=>$color, strokewidth=>$width, fill=>'green');
$img1->Draw(primitive=>'ellipse', points=>'x0,y0 rx,ry a0,a1', stroke=>$color, strokewidth=>$width, fill=>'green');
$img1->Draw(primitive=>'circle', points=>'x0,y0 x1,y1', fill=>'green', stroke=>$color, strokewidth=>$width);
 arc では,x0,y0 x1,y1 で四角い描画領域を指定し,その四角の中に辺に接するように角度a0からa1までの円弧を描く。角度は右横が0度で,時計回り(下向き)に角度を測る。下が90度方向,左が180度方向,上が270度方向になっている。gravity オプションが使えれば,角度の指定方法は変わると思われる(gravityが使えるかどうかもわからないので,あくまで推論) ellipse は中心座標と横方向の半径,縦方向の半径と開始角度,終了角度を指定する。circlex0,y0 で中心座標を指定し,中心座標から点x1,y1 までを半径とする円を描く。stroke 等はlinerectangleなどと同じである。
例1:$img1->Draw(primitive=>'arc', points=>'0,0 100,50 0,225', 
stroke=>'blue', strokewidth=>2, fill=>'green');
例2:$img1->Draw(primitive=>'arc', points=>'0,0 100,50 225,0', stroke=>'blue', strokewidth=>2, fill=>'green');
例3:$img1->Draw(primitive=>'ellipse', points=>'50,50 50,30 0,225', stroke=>'blue', strokewidth=>2, fill=>'green');
例4:$img1->Draw(primitive=>'circle', points=>'50,50 50,5', stroke=>'blue', strokewidth=>2, fill=>'green');

例1:arc例2:arc2例3:ellipse例4:circle

(16) Composite:画像の合成

 図の合成はComposite コマンドを使う。詳しいことはCompositing Imagesを見て欲しいが,以下に例を示しておこう。
# Original画像の読み込み
my $img = Image::Magick->new;
$img->Read($target_pict);

# タイトル用の透明キャンバスの用意
my $img1 = Image::Magick->new;
$img1->Set(size=>'300x50');
$img1->ReadImage('xc:none');

# タイトルの作成
$text='紀伊半島・二木島';
$text = jcode($text)->utf8;
$fontdir='./HGRSMP.TTF';
$color='yellow';
$pointsize=32;
$img1->Annotate(text=>$text,geometry=>'+0+0',font=>$fontdir,fill=>$color,
gravity=>'Center',pointsize=>$pointsize,strokewidth=>1,stroke=>$color);

# 合成
$img->Composite(image=>$img1,compose=>'over',geometry=>'+0+80',gravity=>'Center');

# 出力とメモリの開放
$img->Write($newname);
undef $img1;
undef $img;
ここで,$img という画像に,$img1 というタイトル文字列を合成している。今の場合は,単純に上に重ねればいいのでcomposeover にしている。また,場所の指定は,Center からの相対的な座標で表している。

OriginalTitle (背景が透明なのでpng で出力)TitleをCompositeしたもの

(註):この例は合成を示したいがためにこんなことをしているが,普通は画像(写真)に直接Anotate で文字を描く方が早い。
(註2):gravity で合成する際の座標原点を指定できるが,左下を指定した場合(SouthWest)にオフセットの値をプラスで記述するとうまくいかなかった。そんな時はマイナスの数値にしてみてほしい。

(17) Quantizeを用いた白黒画像への変換

白黒にする方法としてQuantize を使う方法を紹介する。他にもFx を使って演算する方法があるが,それは次の項目にしよう。QuantizeFx で結果は微妙に違うが,大体は同じような白黒画像が得られる。
$img->Quantize(colorspace=>'gray');
Quantize は本来,色の種類を減らすために用いるみたいだが,筆者はまだちゃんと理解できてない。Quantize に関しては,Image Magick の使い方のサイトのColor Quantization and Ditheringを見て欲しい。
オリジナル (160x120)Quantizeで白黒へ

(18) Fx:三原色の色チャネルの演算

白黒変換のところでFx を使って演算する方法があると書いたが,ここではそのFx について書いてみよう。
 まずImage Magick での色についてだが,色を指定するのに幾つかの手法があって,よく知られているのがRGB による指定である。他にもCMYKHSBHSLなど幾つもあるらしい。筆者はRGB しか理解できてないので,RGB で話をしよう。RGB では,赤(r, red),青(b, blue),緑(g, green)の3色の和として色を表している。Image Magick では,色を指定するのに#ccddff のように16進数を使って表すこともできる。ここで,最初の2桁の#cc# は以降が16進数であることを示している) はred 成分の濃さを,次の#ddgreen 成分の濃さを,最後の#ffblue 成分の濃さを表している。16進数で2桁なので,#00~#ff までの値を取りうる。Fx を用いると,この3つの色のチャネルに対して演算を行うことができる。例えば以下のように書くと,greenblue の色の平均をred チャネルに代入できる。
$img = $img->Fx(expression=>'(g+b)/2',channel=>'red');
ここで数式の中のgb がそれぞれgreenチャネル,blueチャネルを表している。redチャネルは数式の中ではrと表される。数式はsincos などのような一般の関数が使えるらしい。次ように書くと,3色の平均を取り,それを全てのチャネルに代入する。結果として白黒画像が得られる。
$img = $img->Fx(expression=>'(r+g+b)/3');
Fx に関しては,Image Magick サイトのThe Fx Special Effects Image Operatorを見て欲しい。
オリジナル (160x120)Fx(expression=>'(g+b)/2',
channel=>'red')
Fxで'(r+g+b)/3'とした

(19) Colorize:色をつける

Colorize を使うと,RGB の3色に別々に色をつけることができる。以下ではFx で白黒画像にしたものにColorize で色をつけている。
$img = $img->Fx(expression=>'(r+g+b)/3');
$color='#fad759';
$opacity='50%';
$img->Colorize(fill=>$color,opacity=>$opacity);
ここでopacity は不透明度を表し,opacity が大きいほど画像は薄くなる(?あれ?逆か?)。
オリジナル (160x120)Fxで'(r+g+b)/3'の後
色'#fad759'とopacity 50%で
Colorizeしたもの
Fxで'(r+g+b)/3'の後
色'#ccddff'とopacity 50%で
Colorizeしたもの

(20) 図の一部を透明にする:TransparentとFx

Image Magick で図を別の図に重ねる時に,図の一部や背景を透明にしたいことがある。Image Magick では,透明にした図を表すために,RGB の3つのチャネルに,alpha チャネル(あるいはmatte チャネル,ないしはopacity チャネル) と呼ばれるチャネルを1個追加して画像を扱っている。つまり色を表すのに#ccdd88ff のように16進数8桁で表している。6桁の場合はalpha チャネルの部分は#ff(透明ではない) とされる。従って,画像を透明にするには16進数8桁で表される色の最後の2桁を#00 にすると完全に透明になる。しかし,画像を処理する際には特定の色のみ透明にしたいことがある。例えば背景を白にしておいて,白い部分だけを透明にしたい,という場合。その場合はTransparent を使うと特定の色を透明にできる。
$img->Transparent(color => 'White');
この方法を使えば,以下のように新しい白いキャンバスを用意しておいて,白の部分を透明にすることで透明なキャンバスを用意することもできる。
use Image::Magick;
my $img1 = Image::Magick->new;
$img1->Set(size=>'300x300');
# ----------------------------------
$img1->ReadImage('xc:white'); # white canvas
$img1->Transparent(color=>'White');
# ----------------------------------
$img1->Write($newname);
undef $img1;
また,図を描いた上に背景色で図を上書きして,背景色を透明にすると図を切り取ることもできる。
 全体を一様に半透明にするにはFx を用いる。Fx の使い方のところで書いたが,Fx では3原色をredgreenblue の3つのチャネルとして演算していたが,透明度のためにalpha チャネル(a チャネル) に対して演算すると透明度が変化する。
$img1 = $img1->Fx(expression=>'a/2',channel=>'alpha');
このようにすると,透明度が50%に下がる。下記の例では(15) Draw:図形の描画(その2)の例4の画像の背景を透明にしたものと,さらに全体を半透明にしたものを写真に合成している。念のために,今回用いた合成のコマンドを書いておく。
$img->Composite(image=>$img1,compose=>'over',geometry=>'+0+0',gravity=>'Center');
透明化に関しては,Image Magick の使い方のサイトのMasking and Background Removalに (2011/4 訂正) Channels, Masks and Transparency詳しく書いてある。
オリジナル (160x120)白を透明にして合成全体を半透明にして合成

(註):色のついた背景(xc:white などで準備したもの)に対しては上記の処理はうまくいかないことがあった。背景を半透明にするには,canvas の準備で透明なキャンバスを選び,全面に好みの色(白でもsilverでもgrayでもいい)をベタ塗りする。その上で上記のように alpha チャンネルの値を減らすとよい。

FreeBSDでPerlMagick(その5)さらに進んだコマンドに続く

2009年12月10日木曜日

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

この投稿はFreeBSDでPerlMagick(その2)図と文字を描くからの続きです。
また,FreeBSDでPerlMagick(その1)はじめにに目次があります。

(9) Rotation:図の回転

図の回転は次のように書く。
use Image::Magick;

my $img = Image::Magick->new;
$img->Read($target_pict);
# ------------------------------
$img->Rotate(degrees => 90);
# ------------------------------
$img->Write($newname);
undef $img;
ここで90時計回りに90°回転させることを意味している。
オリジナルRotation 90を実行した結果Rotation 45を実行した結果


(10) Resize:図の大きさの変更

Resize は以下のように記述する。ここからは,加工の処理の部分のみを書くことにする。
$img->Resize(width => 80, height => 60, blur=>0.5);
この8060が新しいサイズを表している。もとの画像の縦横比と異なる場合については,Resizing or Scalingを読んでみて欲しい。また,blur=>0.5は以前の投稿でも書いたが,画像をどの程度ぼかすかを表す指標であり,1より小さいと多少シャープになる。1より大きいとかなりぼんやりした図になる。
オリジナル (160x120)80x60にResizeした


(11) Crop:図の切り取りとTransformを使ったCropping

図の一部を切り取る処理をCrop という。Crop は以下のいずれかのように書く。いずれでも同じように切り取れる。
$img->Crop(width=>120, height=>120, x=>40, y=>40); # 作戦 1
$img->Crop(geometry=>'120x120+40+40'); # 作戦 2
$img->Crop('120x120+40+40'); # 作戦 3
ここでwidthheight は切り取る幅と高さであり,xy は,左上を原点にした時の切り取る座標の左上の点の位置である。PerlMagickのサイトでは,gravity オプションが選べるように書いてあるが,やってみるとうまくいかなかった。(gravity オプションについてはFreeBSDでPerlMagick(その2)図を描く (8) Annotate を用いた文字の描画を見て欲しい) 調べてみると,以下のように書くとよいとのことだった。
$img = $img->Transform(crop=>'120x120+40+40', gravity=>'SouthWest');
ここでgravitySouthWest なので左下が原点となっている。このTransform というコマンドはPerlMagick のサイトのコマンド一覧には見当たらず,サイトの下の方に書いてあってなかなか気付かなかった。困ったものだ。
オリジナル (160x120)120x120+40+40で
Cropしたもの
左下を原点にして
120x120+40+40で
Cropしたもの


(12) Blur:ぼかす

ぼかすにはBlur を使う。他にRadial BlurGaussian BlurMotion Blur などがある。
$img->Blur('0.0x1.0');
$img->RadialBlur(5);
$img->MotionBlur('0x13+10-10');
Blue の引数はradius x sigma であり,sigma はどれぐらい周りまでの点を使ってぼかすかという半径をpixelで表したものであり,radius は実際の計算でどれぐらいの距離までを用いるかを表す。(ちょっとわかりにくいが,ぼかしのために sigma ぐらいの距離で減衰する関数を使うけど,計算には sigma より広い範囲まで使わないといけないので,それを radius で表している,ということ)radius に関してはsigma の3倍ぐらいがいいらしいが,radius をゼロにすると自動的に最適な値を使ってくれるらしい。Radial Blur の引数は度で表した角度である。Motion Blurの引数についてはOptionsを見て欲しい。Blurring and Sharpening Imagesにぼかし関連の説明がある(英語だけど)
オリジナル (160x120)Blur (0x1)Radial Blur (5)Motion Blur (0x13+10-10)


(13) Sketch, Spread, OilPaint:絵画風の加工

絵画風の加工を幾つか示そう。Sketch は引っかいたような雰囲気にしてくれる。ただし,元の画像が大きいと処理に時間がかかることがあるので注意が必要である。Spread は拡散処理。一種のぼかし加工と言えるかもしれない。OilPaint は油彩画風にしてくれるもの。
$img->Sketch(radius=>0, sigma=>10, angle=>135);
$img->Spread(radius => 2);
$img->OilPaint(radius => 2);
引数についてはOptionsを見て欲しい。
オリジナル (160x120)SketchSpreadOilPaint
Image Magick に関する最初の投稿で紹介した画像処理についてあれこれ に書いてあったのだが,油彩画風にするには,いきなりOilPaint の処理をするのではなくて,SketchSpread の処理をしてから最後にOilPaint の処理をするのがいいみたい。以下がその結果。


(14) Vignette:縁飾り

写真の周りを白っぽくぼかす縁飾りをVignette という。Image MagickでのVignette は縁を白以外の色にすることもできる。以下のいずれかのように書く。
$img->Vignette(geometry=>'0x10+0+0',background=>'White'); # 作戦 1
$img->Vignette(geometry=>'0x7+5+5',background=>'black'); # 作戦 2
ここでgeometryradius x sigma+x+y であり,sigma はぼかす幅,radius はぼかし計算に使う領域の半径(ゼロにセットすると自動で最適化してくれる),xy は,上下左右の端から縁取りまでの距離を表す。
オリジナル (160x120)geometry=>'0x10+0+0'
background=>'White'
geometry=>'0x7+5+5'
background=>'black'


FreeBSDでPerlMagick(その4)図形の描画と画像の加工に続く

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)画像の加工に続く

2009年12月8日火曜日

FreeBSDでPerlMagick(その1)はじめに

追記 2011/03)この間 ImageMagick のサイトが更新されたみたいなので,もしかしたらここの記述が若干ずれているかもしれないのでご注意を(元の記述は2009年12月なので)
このところ,FreeBSD上でのPerlMagick (ImageMagick) にはまっている。もともとはバイク用のサイトにアップする写真の加工が目的で使い始めたが,結構いろいろできるみたいなので,遊んでみた。折角遊んでいろいろわかったことがあるので,ちょこちょこ書こうと思う。

 Image Magick はUnixやWindows上で画像をいじるためのソフトであり,webサイトはImage Magickのサイトにある。本来Image Magick はunixならx-windows上で動き,画像も見せてくれるものだが,ここではPerlを使ったcgiでの使用を念頭に置いているため,Image Magickのサブセット(?言葉が正しいか不安…)であるPerlMagickの使い方について書いていきたい。

(0) 目次

かなり多くの事を書いているので,目次を作ってみた。

FreeBSDでPerlMagick(その1)はじめに
(1) 関連リンク
(2) Perl Magickのインストール
(3) Perl Magickの使い方
(4) pngでの書き出し

FreeBSDでPerlMagick(その2)図と文字を描く
(5) 新しい図のためのcanvasの準備
(6) 図を描く:Drawコマンド
(7) 文字を描く:Labelとして読み込む方法
(8) Annotate を用いた文字の描画

FreeBSDでPerlMagick(その3)画像の加工
(9) Rotation:図の回転
(10) Resize:図の大きさの変更
(11) Crop:図の切り取りとTransformを使ったCropping
(12) Blur:ぼかす
(13) Sketch, Spread, Oilpaint:絵画風の加工
(14) Vignette:縁飾り

FreeBSDでPerlMagick(その4)図形の描画と画像の加工
(15) Draw:図形の描画(その2)
(16) Composite:画像の合成
(17) Quantizeを用いた白黒画像への変換
(18) Fx:三原色の色チャネルの演算
(19) Colorize:色をつける
(20) 図の一部を透明にする:TransparentとFx

FreeBSDでPerlMagick(その5)さらに進んだコマンド
(21) Fx(その2)
(22) LevelやGamma値の調整
(23) Negate:ネガを作る
(24) Posterize:色の種類を減らす
(25) OrderedDither:ザラザラにするコマンド?
(26) 明るさの調整 : SigmoidalContrast
-------------------------------------------------

(1) 関連リンク

まずは関連する有益なリンクについて書こう。
 ・Image MagickのサイトImage Magick の本家のサイト(英語)

 ・PerlMagickPerlMagick のサイト(英語)
   Image Magick の本家サイトのメニューからもたどれる。

 ・Image Magickの使い方(Usage)のサイト:結構詳しく書いてあるが,PerlMagick じゃなくて,Image Magick について書いてあるので,
   そのままでは使えない。Perlスクリプトへの脳内変換が必要。おまけに英語やし。
 (追記)でもこの Usage の説明は重要である。
  それぞれの項目のサブページを見ると,具体例を示しながら説明してあるので,必要に応じて読むと役に立つ。


 ・Image MagickのコマンドラインオプションのサイトImage Magickcommand-line tools を使う時のオプションの一覧。
   PerlMagick のコマンドは,Image Magick ではcommand-line toolsのオプションに相当することが多い。当然英語のサイト。

 ・Image MagickのExamplePerlMagick を使った例が載っている。
   写真を使った例で,初めて見た時,なぜ渦巻変換などの操作が必要か,などがわからなかった。
   多くの変換は,幾何学的な図を描き,それを変形するのに用いるといろいろな図が描けていいらしい。
   写真を渦巻変換してもお姉さんの顔がひずむだけやし…

 ・example.pl:上記のPerlMagick Exampleのソースコード
   貴重なPerlスクリプトの例題

 ・画像処理についてあれこれ:Perlではないが,Image Magick などを使って,いろいろな画像処理,画像描画をされていて,
   どんな処理ができるかの参考になる。具体的な画像で見せてくれるのがいいが,最近はImage Magick じゃないものが多いかも…。

 ・FilterとBlurの効果の一覧:一個前のThumbnailを作るという投稿でも書いたが,Resizeの時のFilterとBlurの効果についての一覧

 ・Thumbnailを作る:このブログの1個前の投稿記事。PerlMagick を使ってサムネイルを作ったもの。参考にしてくださいな。

 他にもきっといいサイトが多く有ると思うが,とりあえず上記を書いておこう。他に良いサイトを見つければ,おいおい追加していこう。
追記)1年以上たつけど,まだ追加はされてません…。あしからず…

(2) Perl Magickのインストール

 まずは,Perl Magick をFreeBSDにインストールしないといけない。しかし,これは実はとても簡単。筆者は
/usr/ports/graphics/ImageMagick
からインストールした。これはImage Magick のインストールだが,一緒にPerl Magick もインストールされる。

(3) Perl Magickの使い方

 使い方だが,最低限,以下のように書くと使うことができる。当然Perl のスクリプトなので,「#!/usr/bin/perl」などのおまじないを忘れないように。
use Image::Magick; # packageを使う宣言

my $img = Image::Magick->new; # インスタンスの生成
$img->Read('./test.jpg');
# 画像の読み込み(描画用に,白や透明やグラデーションなどのcanvasを新しく用意することもできる)
# -------------------------------------
$img->Rotate(degrees => 90); # 画像に対する処理(いろいろな処理ができる。後々述べる)
# -------------------------------------
$img->Write('./newpict.jpg'); # ファイルへの書き出し
undef $img; # 後処理(メモリの開放)
ここで,最初の行はPerlMagick のパッケージを使う宣言である。その次の項目(3行目)で取り扱う画像に$imgという変数を割り当てている。実際に$imgに画像を読み込んでいるのが,Read のある行。そして,ここではRotate という処理をして,Write でファイルとして書き込んでいる。最後に$imgが使っていたメモリを開放してる。

 PerlMagick のいろいろなコマンドはPerlMagickのサイトにあるが,引数の意味などを書いてくれてない。そこで,Image Magickのコマンドラインオプションのサイトで,PerlMagick コマンドに相当するオプションを探して,引数の意味を推定する。場合によってはImage Magickの使い方(Usage)のサイトの該当する処理の所をある程度読まないといけない。このサイトに載っている情報の多くはそのようにして得られたものである。このサイトで少しでも皆さんの理解の手助けをできればサイトを作った甲斐がある。

(4) pngでの書き出し

 ファイルをWrite で書き出すと,通常はjpegになるみたい。でもpngで出力したい場合も出てくる。そんな時は以下のようにするらしい。
binmode(STDOUT);
$img->Write("png:test.png");
 基本的には上記のスクリプトの作業の部分にいろいろと作業を書いて出力すれば結果が得られる。
次は,新しいキャンバスを用意して,図や文字を描いてみる。

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

2009年11月10日火曜日

Thumbnailを作る

バイクに乗った時に,いろいろな写真を撮ってくる。折角撮ってきたらそれを整理したくなる。これまではwindows上のフリーソフトでサムネイルとwebページを作ってくれるソフトを使っていた。名前はすなねいる。何故すなねいるかというと,最初に見つけたから。でもこれが結構いけてた。コメントを入れる時には画像を見ながらコメント書けるし,コメントを保存しておいて後からやり直すこともできるし。しかし,気に入らない点もあった。例えば,写真の一覧の時に横にサムネイルを5個並べるのだが,もうちょっと多くしてwebページの幅を広げたい,とか,コメントと写真の配置が私好みじゃないとか,などである。人の作ってくれたフリーソフトを使っていて文句は言えないが…。そこで,ふと,自分でやってみようか?と思い立った。ではどうするか?まさかwindows上で動くソフトを自分で作ろうとは思わない。だってきっと有料のソフトを使わないといけなさそうだから。そこで,FreeBSD上でやってしまおうと思った。今回はその顛末。

2009年10月2日金曜日

バイクでのカーブの曲がり方について

 バイク屋に行ってみた。理由は,事故って壊れたバイクの代わりのバイク(中古だけど)を購入するための書類(住民票)を届けないといけなかったから。そこで,ちょっと休憩がてらバイク雑誌を読んできた。読んだのは大きなマシンという名の雑誌(英語で言わないと...)。そこで新垣氏がハングオフや膝すりを勧めていた。そういえば最近ハングオフしてないなぁ。ということで,カーブの曲がり方の話をしてみましょう。

2009年9月5日土曜日

HDDのフォーマットにやられた

家でMacintoshを使ってる。そこで大きなファイルバックアップファイルがあるのだが、それをバックアップ用の2.5インチにコピーしようと思った時のお話。普通に2.5インチの持ち運び用のHDDにファイルをドラッグしてコピーしようと思ったら、何故かunknown errorが発生してしまった。何で??と思ったが、何度やってもうまくいかない。仕方ないのでterminalで強引にcpとかscpってやってみた。するとコピーを始めた。やったぁ〜、と思ったが、コピーされたファイルのリストを取ると、サイズが4GBぐらいでカットされていた。むむむ???何が起こってるの???

 で、ディスクユーティリティーでディスクを見ていて気づいた。フォーマットがFAT32になってる。あれ?なんでやろ?もしかしたら買った時のフォーマットのままなのか?それにしてもFAT32とは...仕方ないのでフォーマットをMac拡張(ジャーナリング)にしてみた。そしたら7GBぐらいのファイルもコピーできた。そんな落とし穴があったなんて....

Mac OS-Xでのcronの設定

家でMacintoshを使っている。仕事場ではWindowsとFreeBSDを使っている。FreeBSDだと当然のようにcronでいろいろと自動の処理をさせているが、一応FreeBSDベースと言われているMac OS-Xではつかっていなかった。そこで、使おうと思ったのだが、困ったのがどこにcrontabがあるのか?ということ。crontabを書き直して、cronデーモンを再起動するのがFreeBSDでの作戦だった。crontabは
/etc/crontab
だし、cronデーモンの再起動は
/etc/rc.d/cron restart
でよいのだが、Macintoshだとどうすればいいの?
 そこで、
man crontab
としてみた。すると、crontabというコマンドあるらしい。どうやら、
crontab -l
でリストが取れて、
crontab -e
でエディットできるらしい。実際にやってみると確かにエディットできた。へぇ、そうやって使うんや、と思った次第だった。

2009年7月8日水曜日

gmailの不思議

 メーラーとして,文章中に広告が入らなく,かつ,フリーなので,よくgmailを使っている。browserを使ってどこからでも見れる,というのも気に入っている理由だけど。ところが,browserを使ってgmailを見るのに,時々おかしな振舞いをすることがある。browserはfirefoxを主に使っている。理由はweb開発に便利なツールがアドインとしてあるから。欠点は動作が重いこと。もう少し軽いともっといいだけどねぇ。

 そのfirefoxでgmailを見に行くと大抵は普通に見れるのだが,時々認証後にメールを表示しようとしてプログレスバー(横長の棒の長さが時間と共に徐々に長くなって,処理の進み具合を図示してくれるもの)がでるけど,プログレスバーの最後のところで止まってしまってうんともすんとも言わなくなる,という現象が起こる。そうなったら仕方ないので,右下にでる「簡易版で読み込む」みたいな表示を押して簡易版にするとメールが読める。その後,ログアウトした後にもう一度ログインしようとしても,やはり同じことが起こる。しかし,firefoxを閉じると元に戻って,また普通にメールを見れるようになる。

 問題は「時々」発生して,その原因がわからないこと。対策のしようもない。そんな問題に遭遇して数ヶ月が経つが,ちょっとだけ進展があった。どうやらメールを見ようと思ってログインするけど,新規のメールがないからと「すぐにログアウト」しようとすると上記のような状況に陥るみたい。きっとJavaScriptをいっぱい読み込んでいて,画面を表示するのに時間がかかっているんじゃないかと思っている。ところが,メールがきてないからとさっさとログアウトしようとすると,処理の途中で読込みが中断されて中途半端な状況になるみたい。でも,それ以上はまだ何が起こっているのかわからない。しかし,そんな状況になったからって,毎回firefoxを再起動してたら時間がいっぱいかかって仕方ない。firefoxは起動が遅いのが一番の欠点なのに~~

 そんなこんなでいろいろ試していて,いいことに気づいた。どうやらfirefox自体を終了しなくても,メールを見ようとしていたタブだけ消して開きなおすと,普通にメールが見れる状態になる,ということがわかった。これなら大して時間はかからない。根本的な解決に至ったわけじゃないけど,とりあえずはいいことにして,この問題はよしとしておいた。

2009年6月24日水曜日

最近新規の投稿がない

 このブログに最近新規の投稿をしていない。理由は,投稿できるようなことがないからです。このブログはコンピュータや,バイクなど(コンピュータとバイクって偉い違うなぁ)の技術的なことを書こうと思って作ったので,何かないと投稿するネタがありません。FreeBSDも触っているけど,技術的にどうこう,ってのはあまりなくて,webのコンテンツの中身をいじってたりします。あとは,自分の興味がどこに向いているか,かな?バイクも,ツーリングに行った記録は別のブログに書いてるので,バイクをごそごそいじらないとここには投稿しないんですよねぇ....

 このブログって,数回にわたってある程度濃い感じのFreeBSDネタを書いたので,結構検索でひっかかってきます。みんなやりたいことは似てるんですよね。perlで587番ポートにメールを送りつけたいとか,JavaScriptでformをsubmitしたいとか...少しでもこのブログが皆さんの役に立てればうれしい限りです。