質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

Q&A

解決済

1回答

3088閲覧

FuelPHPでimagemagickを使用する際に「-define jpeg:size」オプションを使いたい

gzrita

総合スコア236

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

0グッド

1クリップ

投稿2016/05/23 09:52

編集2016/05/23 09:59

###実現したい内容

FuelPHPで画像投稿を行う事ができるサービスを制作しています。
その中で、4000px×3000pxなどの巨大な画像を多く扱うため、
画像のアップロード時に、同時にサムネイル画像を作り活用したいと考えています。

###発生している問題

FuelPHPでimagemagickを使用する際に
-define jpeg:sizeオプションを使う事のできる方法を探しています。

FuelPHPには予めImageクラスが用意されているので、それを使用する事にしました。

PHP

1//Controller・実際に圧縮を行っている部分 2Image::load(DOCROOT.'hogehoge') 3 ->resize(320) 4 ->save(DOCROOT.'fugafuga');

いくつかドライバーの選択肢がありますが、サーバのメモリが128MBと少なく、
デフォルトのgdでは圧縮途中にメモリが足りなくなってしまいます。

そこで今回はimagemagickを使用する事にしました。
Configの内容は以下の通りです。

PHP

1//configフォルダ内のimage.phpに記載した設定内容 2return array( 3 'driver' => 'imagemagick', 4 'bgcolor' => null, 5 'watermark_alpha' => 75, 6 'quality' => 70, 7 'filetype' => null, 8 'imagemagick_dir' => '/usr/bin/', 9 'temp_dir' => APPPATH.'tmp'.DS, 10 'temp_append' => 'fuelimage_', 11 'clear_queue' => true, 12 'persistence' => false, 13 'debug' => false, 14 'presets' => array( 15 ) 16);

imagemagickを使用したお陰か、メモリ不足こそ回避したものの、
それでも1枚のサムネイル画像を作るたびに30秒程の時間がかかってしまいます。
(※4000px×3000pxの画像を200px×150pxに圧縮する場合)

そんな中、imagemagickには、巨大な画像から小さい画像を作るときに真価を発揮する
-define jpeg:sizeというオプションがある事を知りました。

参考:うかつに ImageMagick に -define jpeg:size オプションをつけてはいけない

しかし、FuelPHPで-define jpeg:sizeを使用する方法の見当がつきません。

アプリ側から操作できる、その様なオプションがあるのかどうか、
あるいはコア側で何らかの編集を行わなくてはならないのか、
アドバイス・アイデアなどでも構いませんので、ご回答頂けますと幸いです。

私の力不足で大変ご迷惑をおかけいたしますが、よろしくお願い致します。

###補足情報

FuelPHPのバージョンは1.7.2を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

core/classes/image/imagemagick.php
https://github.com/fuel/core/blob/1.7/master/classes/image/imagemagick.php#L62

php

1 2protected function _resize($width, $height = null, $keepar = true, $pad = true) 3{ 4 extract(parent::_resize($width, $height, $keepar, $pad)); 5 $image = '"'.$this->image_temp.'"'; 6 $this->exec('convert', "-define png:size=".$cwidth."x".$cheight." ".$image." ". 7 "-background none ". 8 "-resize \"".($pad ? $width : $cwidth)."x".($pad ? $height : $cheight)."!\" ". 9 "-gravity center ". 10 "-extent ".$cwidth."x".$cheight." ".$image); 11 $this->clear_sizes(); 12}

imagemagick::_resizeを見る限り、外部からのオプション変更は無理そうですね。
他のドライバーと足並みを揃えるためにある程度オプションが決めうちになっているようなので、
場合によってはImageクラスを使わないのも手かもしれません。
コアに変更を加える場合は、継承・拡張したクラスをbootstrapで差し替えるといいです。

###コアの拡張

修正版を作成(例:/app/classes/hoge/imagemagick.php)

php

1 2class Image_Imagemagick extends \Fuel\Core\Image_Imagemagick 3{ 4 protected function _resize($width, $height = null, $keepar = true, $pad = true) 5 { 6 //メソッド修正 7 } 8 9 //もしくはメソッド追加 10}

差し替え:/app/bootstrap.php

php

1\Autoloader::add_classes(array( 2 'Image_Imagemagick' => APPPATH.'classes/hoge/imagemagick.php', 3)); 4

###png:size

ImageMagickの公式で検索すると、png:sizeってオプション無いような気が...
http://www.imagemagick.org/script/command-line-options.php?#define

投稿2016/05/23 14:19

nnssn

総合スコア1221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gzrita

2016/05/25 01:42

先日に引き続き、回答ありがとうございます。 確かに、Imageクラスを使わないというのもひとつの手ですね。 少し頭が固くなっていました。 今回は素直に直接ImageMagickを使用して実装する事にしました。 しかも、こうして直接操作すると、Imageクラスを利用するより段違いに高速で、 -define jpeg:sizeを使わなくても充分使える速度にする事ができました。 足並みを揃えるためか、何か内側で色々と動いているのでしょうか。 なんにしてもお伺いして良かったです。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問