モノノフ日記

普通の日記です

PECL::Imagickを試す

GDで展開できない画像*1があったのでImageMagickを試そうと思って導入してみました。

インストール

peclモジュールなのでコマンドライン1発で楽チン。

sudo pecl install imagick

php.iniにライブラリを呼び出す記述を追加

extension=imagick.so

実際に使ってみる

マニュアルはいろいろ探しましたが、PHPマニュアルが一番詳しいと思います。
PHP: Imagick 画像ライブラリ - Manual
しかしPHPマニュアルもAPI一覧のみで詳しい解説は書かれていないので実際に使って試してみました。

サンプル画像はこれです。

リサイズしてみた

APIリストを眺めてみるとリサイズに使いそうなメソッドである下記5つを試してみました。

  • Imagick::adaptiveResizeImage
  • Imagick::cropImage
  • Imagick::thumbnailImage
  • Imagick::resizeImage
  • Imagick::cropThumbnailImage
Imagick::adaptiveResizeImage
メソッドの説明

データに依存する三角測量にもとづいて画像のサイズを変更する, と記述されてますが何のことやら。。引数のcolumns, rowsはマニュアルページのサンプルコードから類推すると、それぞれ縦幅, 横幅の様です。

bool Imagick::adaptiveResizeImage ( int $columns , int $rows )

http://jp2.php.net/manual/ja/function.imagick-adaptiveresizeimage.php
サンプルコード

300x300の正方形にリサイズしています。

<?php
  $image = new Imagick('/path/to/sample.jpg');
  $image->adaptiveResizeImage(300,300);
  header('Content-type: image/jpeg');
  echo $image;
結果
Fatal error: Call to undefined method Imagick::adaptiveResizeImage()

メソッドが無いみたいです。とりあえず次へw

Imagick::cropImage
メソッドの説明

切り取りたい縦・横幅と元画像の切り取り開始位置を引数にとってます。よくあるcropメソッドですね。

bool Imagick::cropImage ( int $width , int $height , int $x , int $y )

http://jp2.php.net/manual/ja/function.imagick-cropimage.php
サンプルコード

300x300の大きさで、元画像の左隅(0,0)からcropさせてみました。

<?php
  $image = new Imagick('/path/to/sample.jpg');
  $image->cropImage(300,300, 0, 0);
  header('Content-type: image/jpeg');
  echo $image;
結果

f:id:Kiske:20080217121007j:image

元画像の左隅の壁の部分がcropできてます。

Imagick::thumbnailImage
メソッドの説明

fitをtrueにすると、columnsかrowsの小さい方の値に合わせてサムネイルが生成される模様です。

bool Imagick::thumbnailImage ( int $columns , int $rows [, bool $fit ] )

画像のサイズを指定したものに変更し、関連付けられたプロパティをすべて削除します。 ウェブ上での表示に適した小さなサムネイル画像を作成します。 3 番目のパラメータに true を指定すると、columns や rows にそれぞれの最大値を使用します。両方のパラメータが、 マッチするまであるいは指定したパラメータより小さくなるまで縮小されます。

http://jp2.php.net/manual/ja/function.imagick-thumbnailimage.php
サンプルコード

300x300の大きさで、filをtrueにしてサムネイル生成

<?php
  $image = new Imagick('/path/to/sample.jpg');
  $image->thumbnailImage(300, 300, true);
  header('Content-type: image/jpeg');
  echo $image;
結果

f:id:Kiske:20080408141932j:image
元画像の比率を維持したまま、サムネイル生成しています。大きさは画像の最大長側(この場合は横幅)を基準としているため300x225にリサイズされています。

Imagick::resizeImage
メソッドの説明

Imagick::thumbnailImage()との違いはfilter, blurを指定できる所の様です。

bool Imagick::resizeImage ( float $columns , float $rows , int $filter , float $blur )

指定した大きさとフィルタで、画像のサイズを変更します。

http://jp2.php.net/manual/ja/function.imagick-resizeimage.php
サンプルコード

マニュアルのサンプルコードをまねて、LANCZOSフィルタ*2を使ってみます。その他の各種フィルタ定数はマニュアルを参考してください

<?php
  $image = new Imagick('/path/to/sample.jpg');
  $image->resizeImage(300, 300, imagick::FILTER_LANCZOS, 0);
  header('Content-type: image/jpeg');
  echo $image;
結果

f:id:Kiske:20080217121007j:image

無理やり300x300に縮小しているので比率がおかしくなっています。

Imagick::cropThumbnailImage
メソッドの説明

縮小してからサムネイルを生成するメソッド。centerから指定した大きさで切り取ってくれてる様です。

bool Imagick::cropThumbnailImage ( int $width , int $height )

固定サイズのサムネイルを作成します。まず画像のサイズを縮小し、指定した範囲を中心から切り取ります。

http://jp2.php.net/manual/ja/function.imagick-cropthumbnailimage.php
サンプルコード

300x300のサムネイルを生成しています。

<?php
  $image = new Imagick('/path/to/sample.jpg');
  $image->cropThumbnailImage(300, 300);
  header('Content-type: image/jpeg');
  echo $image;
結果

f:id:Kiske:20080408143555j:image
元画像と比較すると、左右が切り取りとられていますが比率は維持されています。

まとめ

ざっくりと用途を考えると下みたいな感じでしょうか。

メソッド名 用途
Imagick::adaptiveResizeImage メソッドが存在しないようなので使えない
Imagick::cropImage 元画像から切り取る範囲が決まっている
Imagick::thumbnailImage 比率維持したまま、サムネイル作りたい
Imagick::resizeImage フィルタ使って、サムネイル作りたい
Imagick::cropThumbnailImage 比率維持したまま、中心から任意の範囲を切り取りたい

*1:VQ1005というトイカメラで撮影された画像

*2:aviutlのプラグインで見たことある名前