実現したい内容
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
というオプションがある事を知りました。
しかし、FuelPHPで-define jpeg:size
を使用する方法の見当がつきません。
アプリ側から操作できる、その様なオプションがあるのかどうか、
あるいはコア側で何らかの編集を行わなくてはならないのか、
アドバイス・アイデアなどでも構いませんので、ご回答頂けますと幸いです。
私の力不足で大変ご迷惑をおかけいたしますが、よろしくお願い致します。
補足情報
FuelPHPのバージョンは1.7.2を使用しています。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
core/classes/image/imagemagick.php
https://github.com/fuel/core/blob/1.7/master/classes/image/imagemagick.php#L62
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ってオプション無いような気が...
http://www.imagemagick.org/script/command-line-options.php?#define
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/25 10:42
確かに、Imageクラスを使わないというのもひとつの手ですね。
少し頭が固くなっていました。
今回は素直に直接ImageMagickを使用して実装する事にしました。
しかも、こうして直接操作すると、Imageクラスを利用するより段違いに高速で、
-define jpeg:sizeを使わなくても充分使える速度にする事ができました。
足並みを揃えるためか、何か内側で色々と動いているのでしょうか。
なんにしてもお伺いして良かったです。ありがとうございました!