11月 2009 のブログ記事

imagickでテキストを書く実験。本当に資料がなくて困る・・・。なんとなくやってる間に分かってきたけど・・・。



今日の実験、前回の記事では四角形をつくったので、そこに各辺(たて・よこ)の長さの注釈を入れてみる。


<?php

//四角形用
$draw = new ImagickDraw();
$draw->line( 0, 0, 250, 0);#上の辺
$draw->line( 250, 0, 250, 120);#右の辺
$draw->line( 250, 120, 0, 120);#下の辺
$draw->line( 0, 120, 0, 0)#左の辺

//ヨコの辺の注釈
$draw2 = new ImagickDraw();
$draw2->setFont('./Justus-Versalitas.ttf');#フォント指定
$draw2->setFontSize(11);#フォントサイズ指定
$draw2->setFillColor('#000000');#フォントカラー
$draw2->setTextAlignment( imagick::ALIGN_CENTER );#センター寄せ
$draw2->annotation(125, 12 , '250');#テキスト書き込み(x位置,y位置,テキスト)

//タテの辺の注釈用
$draw3 = new ImagickDraw();
$draw3->setFont('./Justus-Versalitas.ttf');
$draw3->setFontSize(11);
$draw3->setFillColor('#000000');
$draw3->translate( 253, 60 );#指定の座標へ移動させる(x位置,y位置)
$draw3->rotate(90);#90度回転
$draw3->setTextAlignment( imagick::ALIGN_CENTER );#センター寄せ
$draw3->annotation(0, 0 , '120');#テキスト書き込み(x位置,y位置,テキスト)


//Imagickオブジェクト
#参考http://labs.unoh.net/2009/05/imagemagick.html
$image = new Imagick();
$image->newImage( 264, 122, new ImagickPixel('#FFFFFF'));
##$image->setPage( 300, 300, 0, 0);
#$image->spliceImage( 300, 300, 0, 0);
#$image->setImagePage( 300, 300, 0, 0);
#$image->setFormat('gif');
$image->setImageFormat('gif');
#$image->setResolution( 300, 300 );
$image->drawImage( $draw );
$image->drawImage( $draw2 );
$image->drawImage( $draw3 );

header('Content-type: image/gif');
echo( $image->getimageblob() );
#$image->setImageFormat('jpeg');
#    $img->writeImage('test.jpg');
$image->destroy();
$draw->destroy();
$draw2->destroy();
$draw3->destroy();

一度やってしまえば案外簡単。
簡単な図形くらいはどうにかなりそう。

GUI環境がインストールしてあるOS環境なら、setFont()はいらないっぽい。

CUI環境のみの場合、setFont()で使うフォントは、スクリプトと同ディレクトリに使うフォントを入れておく必要があるらしい。(フリーフォント探すのが面倒だ!)

※※余計なコメント行がたくさんありますが、色々実験した痕跡なので無視してくださいな。

PHPのImagickで四角形とか描画とかしなきゃいけなくなったので、調べたら、うわぁ。。。全然参考になるところないね・・・。

ということで今日まで分かったことをメモメモ。


線を描いたりフォントで文字書いたりするのは、ImagickDrawオブジェクトを利用

このImagickDrawオブジェクトをImagickオブジェクトへはっつける。

出力

という手順を踏むらしい。

どうやらファイルに出力しなくても直接バイナリを得てPHPで出力も可能ということ。


じゃあやってみよう!

<?php

//四角形を描く
$draw = new ImagickDraw();#ImagickDrawを作って...
$draw->line( 0, 0, 250, 0);#右$draw->line( 250, 0, 250, 120);#下
$draw->line( 250, 120, 0, 120);#左
$draw->line( 0, 120, 0, 0);#上
#↑このように線を引く。多角形を描く「polygon」メソッドもあり、こっちでもいいじゃないかなぁと...

//Imagickオブジェクトを作成。実際の出力とかはこっちでやる!
$image = new Imagick();
$image->newImage(252, 122, new ImagickPixel('#FFFFFF'));
#↑新しい画像(キャンバスみたいなもの??)を作成
# 線の幅分を加算しなきゃいけないことに注意。

$image->setImageFormat('gif');#画像フォーマットをgifに設定します。
$image->drawImage( $draw );#描画した四角形を画像に貼り付け!

header('Content-type: image/gif');#適切にMIMEタイプを設定して...
echo( $image->getimageblob() );#「getimageblob」メソッドを使うとバイナリを得ることができるのでそのまま出力。

?>

↑こんな感じ。。。うーむ・・・理屈は理解したが、、、慣れが必要だ・・・。

とりあえず第一関門突破。ここにあとは文字を流し込まなきゃならないので、それはまた後日。

Filemakerなでしこプラグイン関連連投です。


今回やってみたのは、Win32APIでメッセージボックスを出す方法です。

FMにもカスタムダイアログあるじゃねぇかって、、、確かにそうなんですけど、Windows標準のダイアログじゃないので、なんかイケてないなぁって・・・。FM使いの人の中で同じコトを思った人絶対いると思います。

じゃぁなでしこに「言う」命令があるじゃねぇかって、、、こちらも確かにそうなんですけど、なでしこプラグインの仕様では、「言う」命令で出せるダイアログはオーナーがFMのウインドウハンドルになっていなくて、ダイアログのボタンを押さずに、FMのウインドウのどこかをクリックしてしまうと、ダイアログがウインドウの後ろに隠れてしまって、気がつかないとハングアップしているように見えてしまうんですよ。

ということで、
・FMでWindows標準のメッセージボックスを出す。
・ダイアログはFMのウインドウがオーナーとなっている。
ということを目標に作っています。



はい、いつものようにダウンロードはこちらから。

今回も説明は割愛・・・。申し訳ないです。時間がありません・・・。


なでしこのオープンファイルダイアログなんかも、FMがオーナーになっていないので同様の不都合が生じるので、Win32APIでやろうかなぁと思ってたら、構造体の定義が面倒で、今日は時間切れ。またそのうち。

その前に、なでしこプラグイン側で対応してくれないかなーーーとちょっと思ってたり・・・。

ひさびさにFilemakerのなでしこプラグインについてのお話。


Filemakerは、他のソフトで言うところのマクロに値するスクリプトを駆使して、アプリケーションを作り上げるデータベースソフトです。ゆえに、開発者が意図しない利用者の動作手順は、往々にして不具合に直結しがち・・・。

ウインドウ内の「閉じる」「最大化」「最小化」ボタンもその一端じゃないでしょうか?私の個人的な経験ではそういった問題は結構多いです。

そこで、なでしこプラグインで、これらのボタンを有効化|無効化できる仕組みを作ってみました。

↑これが通常状態。これを、、、

↑こんな風に変えれます。最小化と閉じるボタンを無効にしています。

どうですか?使いようによっては便利でしょ?(・・・とは言いつつ、実はすでに同様のプラグインがどっかにあったとは記憶していますが・・・)


せっかくなので、使っていただけるようサンプルを用意しました。

ここからダウンロードしてください。

使い方は同梱のテキストをお読みください。



仕組みだけ説明しますと、なでしこがWin32APIを実行できるようになっているので、これを使って、ウインドウのスタイルを変化させています。

FilemakerでWin32APIを実行できるというのは、結構強みだと思います。そういう意味でも私は、なでしこプラグインが大好きなんだなー。(バグはご愛嬌ということで・・・笑)

細かい説明は難しい話になってしまい、FMのユーザー向けじゃないのなかぁ・・・という勝手な言い訳をさせてください。(本当は書くのが面倒なだけ・・・)

サンプルをダウンロードしてもらえれば、ソースは丸分かりですから、なでしことWin32APIが少し分かる人なら、なんとなく理解ができるはずです。改変も許可していますから、ご自由にお使いください。

個人的メモメモ。

WordPressでカテゴリごとや、月ごとのRSSを出力するには、基本的に最後にfeedを足したURLで完成。

■カテゴリ
このブログの「filemaker」カテゴリのURLは、

http://agilmente.com/category/filemaker/

ここにfeedを足す。

http://agilmente.com/category/filemaker/feed

■月別
2009年11月のアーカイブURLは、

http://agilmente.com/2009/11/

ここにfeedを足す

http://agilmente.com/2009/11/feed

超簡単。パーマリンク設定をしている場合はこんな感じだけど、してない場合は調べてません。すみません。

あと、これらはPerl/CGIやPHPからアクセスすると、うまく表示できないことがあるかも。そのときは確かUAを偽装するとうまくいった気がする。

ファイルメーカーユーザーグループ中部というグループの勉強会に行ってまいりました。

FMに関しては私は専門というわけではないので、私なぞのレベルの10段階とか100段階とか上の方々がいらっしゃるのかと内心ガチガチに緊張しながら行ったのですが、中にはそういった方もいらっしゃいましたし、業務でちょっと触るだけだよって方もいらっしゃいました。本当にさまざまな人が集まっていて、なかなかいいグループじゃないかと思います。また、FMの汎用さを物語っているのかなという気がします。

何名かの方々は、このブログをご覧いただいているようで、普段私はWCAN界隈や、オープンソース界隈で生息するWEBプログラマなので、専門が違い非常に恐縮ですが、今後ともよろしくお願いいたします。

東海近県でFMを使っている方、今度参加してみませんか?