PHP Thumbnailer Class v2.0でmimetypeを判別する

symfonyでアップロードされた画像ファイルのサムネイル生成を行うために、sfThumbnailPluginを使ってやってみたけど、 正方形切り抜きができなさそうなのでもう少し高機能な感じのPHP Thumbnailer Class v2.0を使うことにしました。

とりあえず、PHP5用のをダウンロードして「SF_ROOT_DIR/lib/vender/php5_thumbnail_v2」に「thumbnail.inc.php」を「thumbnail.class.php」にリネームしてコピー。
あとは「symfony cc」でキャッシュをクリアして準備完了。

とりあえず使ってみる。

<?php
if($this->getRequest()->getFileName('image'))
{
  $savename = md5(uniqid(rand(0,1)));
  $size = 100;  // 100x100の正方形
  list($width, $height) = getimagesize($this->getReqest()->getFilePath('image'));
  $thumbnail = new Thumbnail($this->getReqest()->getFilePath('image'));
  $thumbnail->resizePercent(max($size/$width, $size/$height)*100);
  $thumbnail->cropFromCenter($size);
  $thumbnail->save(sfConfig::get('app_thumbnail_dir') . '/' . $savename);
}

という感じで100x100のサムネイルを作成しようとしたのですが「Unknown file format」とかでてエラー。

ソースみるとファイルの拡張子でファイルタイプを判別しようとしてるっぽい。
アップロードされたファイルは「/tmp/xxxxxx」とかいう拡張子なんて無いファイルなので「Unknown file format」って、もう少し努力してください。

とりあえず以下のようにソース書き換え

<?php
// thumbnail.class.php  132行目付近

//if there are no errors, determine the file format
if($this->error == false) {
  $fileinfo  = getimagesize($this->fileName);

  switch($fileinfo['mime'])
  {
    case 'image/jpeg':
    case 'image/pjpeg':
     $this->format = 'JPG'; break;
    case 'image/gif':
      $this->format = 'GIF'; break;
    case 'image/png':
      $this->format = 'PNG'; break;
    default:
      // check if gif
      if(stristr(strtolower($this->fileName), '.gif')) $this->format = 'GIF';
      // check if jpg
      elseif(stristr(strtolower($this->fileName), '.jpg') || stristr(strtolower($this->fileName), '.jpeg')) $this->format = 'GIF';
      // check if png
      elseif(stristr(strtolower($this->fileName), '.png')) $this->format = 'GIF';
      // unknown file format
      else {
        $this->errmsg = 'Unknown file format';
        $this->error = true;
      }
  }
}

これで一応使えるようになったぽい。