Ranvis Script

Ranvis Script > Perl/PHP > Ming

Mingのビルド

MingはFlashムービー (swf)を生成できるプログラム。例えばActionScriptからloadmovieで取りこむことができない形式の画像をswfに透過的に変換するために使うことができる。

ビルド前に必要なパッケージを用意しておく。

# yum -y install freetype-devel libpng-devel libungif-devel php-devel

PHP4の場合

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の場合

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

Mingをインストール

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を開くと可愛らしい猫の画像が表示される。

うまくいかない場合は画像が美術的に正しいか確認しよう。