アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

Seam Carvingで自然に画像をリサイズするPHPエクステンション

以前に紹介したSeam Carvingという技術を使用したプログラムをPHPエクステンションで実装してみました。
実験的なものなのでご利用は自己責任でお願いします。

少し前の話題となってしまいますが、Seam Carvingを使用した画像のリサイズが話題になりました。
オンラインサービスでresizrというものまで出てきているようです。

ロジック自体は単純なので割とすぐにPHPで実装できたのですが、パフォーマンスが最悪だったのです。
そこで、PHPエクステンションなら何となるかなと思いトライしてみました。

seam_carving.tar.gz
cocoiti さんの指摘を修正しました。ご指摘ありがとうございます!

以下のように画像を縮小することができます。

元画像(1024×768)


768×768
かなりスムーズなリサイズです。


512×768
半分になっても意外と大丈夫ですね。


256×768
さすがに4分の1にまで縮小すると汚くなってしまいます。



エクステンション自体のインストールはtar.gzを解凍して、phpize、configure、make とします。



$ tar xzf seam_carving.tar.gz
$ cd seam_carving
$ phpize
$ ./configure
$ make


modulesディレクトリにseam_carving.soができあがるので make install でインストールするなり、どこかのディレクトリにおいておきます。

準備ができたら、以下のようにしてリサイズします。



<?php

dl('seam_carving.so');

$im = imagecreatefromjpeg('Antelope.jpg');
$new_im = seam_imagecreate($im, 100);



画像のリサイズは seam_imagecreate関数で実行します。第1引数がGDの画像リソースで、第2引数が横方向にカットするピクセル数です。

マシンスペックにもよると思いますが、1024×768の画像を1秒で10ピクセルくらいずつカットすることができました。

これでもずいぶんとPHPプログラムでの実装よりは高速になっています。エクステンションのコードを修正すれば、まだまだ高速化できると思います。

まだまだエクステンションの書き方がわかっていないので、エラー処理ができていません。異常終了したりするかもしれません。。
そこら辺は多めに見てください^^;