質問: ### 実現したい内容 FuelPHPで画像投稿を行う事ができるサービスを制作しています。 その中で、4000px×3000pxなどの巨大な画像を多く扱うため、 画像のアップロード時に、同時にサムネイル画像を作り活用したいと考えています。 ### 発生している問題 > > FuelPHPで`imagemagick`を使用する際に > > `-define jpeg:size`オプションを使う事のできる方法を探しています。 > > > FuelPHPには予め`Image`クラスが用意されているので、それを使用する事にしました。 ``` //Controller・実際に圧縮を行っている部分 Image::load(DOCROOT.'hogehoge') ->resize(320) ->save(DOCROOT.'fugafuga'); ``` いくつかドライバーの選択肢がありますが、サーバのメモリが128MBと少なく、 デフォルトの`gd`では圧縮途中にメモリが足りなくなってしまいます。 そこで今回は`imagemagick`を使用する事にしました。 Configの内容は以下の通りです。 ``` //configフォルダ内のimage.phpに記載した設定内容 return array( 'driver' => 'imagemagick', 'bgcolor' => null, 'watermark_alpha' => 75, 'quality' => 70, 'filetype' => null, 'imagemagick_dir' => '/usr/bin/', 'temp_dir' => APPPATH.'tmp'.DS, 'temp_append' => 'fuelimage_', 'clear_queue' => true, 'persistence' => false, 'debug' => false, 'presets' => array( ) ); ``` imagemagickを使用したお陰か、メモリ不足こそ回避したものの、 それでも1枚のサムネイル画像を作るたびに30秒程の時間がかかってしまいます。 (※4000px×3000pxの画像を200px×150pxに圧縮する場合) そんな中、imagemagickには、巨大な画像から小さい画像を作るときに真価を発揮する `-define jpeg:size`というオプションがある事を知りました。 > > 参考:うかつに ImageMagick に -define jpeg:size オプションをつけてはいけない > > > しかし、**FuelPHPで`-define jpeg:size`を使用する方法**の見当がつきません。 アプリ側から操作できる、その様なオプションがあるのかどうか、 あるいはコア側で何らかの編集を行わなくてはならないのか、 アドバイス・アイデアなどでも構いませんので、ご回答頂けますと幸いです。 私の力不足で大変ご迷惑をおかけいたしますが、よろしくお願い致します。 ### 補足情報 FuelPHPのバージョンは1.7.2を使用しています。
回答: core/classes/image/imagemagick.php ``` protected function _resize($width, $height = null, $keepar = true, $pad = true) { extract(parent::_resize($width, $height, $keepar, $pad)); $image = '"'.$this->image_temp.'"'; $this->exec('convert', "-define png:size=".$cwidth."x".$cheight." ".$image." ". "-background none ". "-resize \"".($pad ? $width : $cwidth)."x".($pad ? $height : $cheight)."!\" ". "-gravity center ". "-extent ".$cwidth."x".$cheight." ".$image); $this->clear_sizes(); } ``` imagemagick::_resizeを見る限り、外部からのオプション変更は無理そうですね。 他のドライバーと足並みを揃えるためにある程度オプションが決めうちになっているようなので、 場合によってはImageクラスを使わないのも手かもしれません。 コアに変更を加える場合は、継承・拡張したクラスをbootstrapで差し替えるといいです。 ### コアの拡張 修正版を作成(例:/app/classes/hoge/imagemagick.php) ``` class Image_Imagemagick extends \Fuel\Core\Image_Imagemagick { protected function _resize($width, $height = null, $keepar = true, $pad = true) { //メソッド修正 } //もしくはメソッド追加 } ``` 差し替え:/app/bootstrap.php ``` \Autoloader::add_classes(array( 'Image_Imagemagick' => APPPATH.'classes/hoge/imagemagick.php', )); ``` ### png:size ImageMagickの公式で検索すると、png:sizeってオプション無いような気が...