画像合成の高速化

cakephpとは直接関係ありませんが、画像合成のプログラムを作っています。

定石通り(?)ImageMagickのconvertコマンドを実行して処理しようとしているのですが、なかなか速度がでない。(500x500に1回合成で、0.18s)

ウノウさんのブログでも、k-tai.orgさんでも、直接convertコマンドを呼んでいるみたいなのですが、どのような高速化をしているんだろう。。。
http://ke-tai.org/blog/2008/06/30/imgnoforward/

グーグル先生にお知恵を拝借したところ、ちらほら、GraphicsMagickが良いみたいなURLがありました。
http://akimoto.jp/blog/2009/04/05/flickr-php5-migration-performanc/
http://www.graphicsmagick.org/benchmarks.html


ということで、ImageMagickから、その派生ソフトウェアであるGraphicsMagickを使ってみました。そうすると、、、おぉ!!!!

合成処理をtimeコマンドで比較してみたところ、速度面では7,8割増の性能を得ました!以下の例は、480x500の画像ファイル(Base.jpg 16bit)にい250x250(item.gif)を合成(out.jpg)しています。


#time convert base.jpg item.gif -geometry +0-0 -composite out.jpg

real 0m0.181s
user 0m0.443s
sys 0m0.025s


#time gm composite -geometry +0+0 itme.gif base.jpg out.jpg

real 0m0.103s
user 0m0.251s
sys 0m0.012s


んー、GraphicsMagickにするか。な。。

CakePHP1.3にしたらau機種(一部)の文字化けで悩んだ

ケータイ向けサイトをcakePHPで作っています。
絵文字を変換するために、HTML_Emojiというライブラリを利用させてもらっているのですが、1.2.5から.1.3.2にバージョンアップしたところ、フォームで渡される文字列が文字化けし始めました。なぜ??と思って、少しハマっていたところ、Formヘルパのcreateが出力する文字列が違うことに気がつきました。

//1.2.5では、
$form->create('User',array('action'=>'confirm',,'url'=>array('?'=>'guid=on')));
//とすると
<form id="UserConfirmForm" method="post" action="/users/confirm?guid=on">
//となると思います。(div,inputは省略)

//1.3.2では
$form->create('User',array('action'=>'confirm',,'url'=>array('?'=>'guid=on')));
//すると、出力が
<form id="UserConfirmForm" method="post" action="/users/confirm?guid=on" accept-charset="utf-8">
//となります。

「accept-charset」??
そして、accept-charsetを入れると、UTF8をサポートしていない(と思っていた)auも、mb_detect_encodingで調査するとフォームからUTFで返すようでした。(URBANO BARONEで検証、でもW61Pは文字化けしなかった。)

そこで、ググってみると、CookBookのimprovementsにこうありました。

Forms now get an accept-charset set automatically, it will match the value of App.encoding, it can be overridden or removed using the 'encoding' option when calling create().

// To remove the accept-charset attribute.
echo $this->Form->create('User', array('encoding' => null));

ということで、

$form->create('User', array('action' => 'confirm','encoding'=>null,'url' => array('?' => 'guid=on')))
//出力
<form id="UserConfirmForm" method="post" action="/users/confirm?guid=on">

めでたくaccept-charsetが消えて、文字化けも解消されました!
ケータイ向けにサイトを作成しているみなさま、お気をつけくださいまし!