MingはFlashムービー (swf)を生成できるプログラム。例えばActionScriptからloadmovieで取りこむことができない形式の画像をswfに透過的に変換するために使うことができる。
ビルド前に必要なパッケージを用意しておく。
# yum -y install freetype-devel libpng-devel libungif-devel php-devel
Mingは現時点で最新の0.3.0を使う。
# tar -zxf ming-0.3.0.tar.gz # tar -zxf ming-php-0.3.0.tar.gz # cd ming-0.3.0 # ./configure # make # make install # cd php_ext # make # make install
最後にPHPモジュールを登録する。
# echo 'extension=php_ming.so' > /etc/php.d/php_ming.ini
# apachectl graceful # tail /var/log/httpd/error_log
PHP5に対応しているCVS版(現時点では0.4.0beta3相当)を持ってくる。
# cvs -z3 -d:pserver:anonymous@ming.cvs.sourceforge.net:/cvsroot/ming co -P ming # cd ming # ./autogen.sh # ./configure # make # make install
php拡張をPHP5のext内にコピーする。ちなみに元からext内にあるものでは有効なming.soを作れなかった。
# cp php_ext/* [php-5.2.0]/ext/ming/ # cd [php-5.2.0] # ./configure ... --with-ming=shared,/usr/local # make # make install
最後にPHPモジュールを登録する。
# echo "extension=ming.so" > /etc/php.d/ming.ini
# apachectl graceful # tail /var/log/httpd/error_log
これで良いはずだが、SWFBitmapにPNGファイルのハンドルを渡してswfを書きだしてみたところ、画像が正しく表示されなかった。
そこでlibming.so自体は0.3.0を使うことにする。
# tar -zxf ming-0.3.0.tar.gz # tar -zxf ming-php-0.3.0.tar.gz # cd ming-0.3.0 # ./configure # make # make install
CVS版のPHP拡張は0.3.0にはない関数をインポートしている。
そのままではPHPモジュールのロードに失敗してしまうので適当に古い日付のものをひっぱってくる。
# cd [php-5.2.0]/ext/ # rm -rf ming/* # cvs -z3 -d:pserver:anonymous@ming.cvs.sourceforge.net:/cvsroot/ming ex -D 2007-01-01 -d ming ming/php_ext # cd [php-5.2.0] # make # make install-modules
# apachectl graceful # tail /var/log/httpd/error_log
phpinfo()の表示は0.3.0にはならないので注意。
Ming 0.3.0で埋め込んだJPEGはFlash Lite環境で正常に読み込めず、赤い画像になってしまう。
ありがたいことに問題の詳細とパッチを公開されている方がいるので、携帯向けの開発を行う場合は利用させてもらう。
patch -b jpeg.c jpeg.c.diff
うまく当たったら、リビルドして完了。
RHELっぽいディストリビューションのPHP5に対して、出来るだけお手軽にming-0.4.0.beta5を入れてみる。
PHP4は言語仕様で苦労したい人向けなので対象外になる。
# 頑張ってPHP5を入れる yum install php # 開発環境を入れる yum install gcc php-devel # Mingの為のライブラリを入れる yum install freetype-devel libpng-devel libungif-devel
tar -jxf ming-0.4.0.beta5.tar.bz2 cd ming-0.4.0.beta5 # 前述のパッチを当てる patch -bd src/blocks/ < jpeg.c.diff ./configure make make install # PHPモジュール cd php_ext/ make # インストール先を探す php -i | grep extension_dir # extension_dir => /usr/lib/php/modules/ => /usr/lib/php/modules/ # コピーする cp tmp/modules/ming.so /usr/lib/php/modules/
試しにdl()関数でモジュールをロードしてみる。
$ php -r "dl('ming.so');" PHP Warning: dl(): Unable to load dynamic library '/usr/lib/php/modules/ming.so' - libming.so.0: cannot open shared object file: No such file or directory in Command line code on line 1
libming.so.0が見つからないと出る。
$ php -i | sed 's/ /\n/g' | grep libdir '--libdir=/usr/lib' '--with-libdir=lib'
どうやらlibmingがインストールされるのは/usr/local/lib/なのに、先ほど入れたPHPは/usr/lib/を探すようだ。
そういう訳で安直にコピーしてしまう。
cp -a /usr/local/lib/libming.* /usr/lib/ php -r "dl('ming.so');"
dl()を呼んで何も表示されなければ、Mingが正常にロードされたということになる。
画像sample.pngよりsample.swfを作成してみる。swfのバージョンはもちろん4。
<?php dl('ming.so'); ming_useswfversion(4); $swf = new SWFMovie(); $swf->setDimension(640, 480); $swf->add(new SWFBitmap(fopen('sample.png', 'rb'))); $swf->save('sample.swf'); ?>
sample.swfを開くと可愛らしい猫の画像が表示される。
うまくいかない場合は画像が美術的に正しいか確認しよう。