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

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

ただいまの
回答率

90.47%

  • PHP

    20810questions

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

  • FuelPHP

    524questions

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

  • ImageMagick

    94questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,106

gzrita

score 213

実現したい内容

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を使用しています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/25 10:42

    先日に引き続き、回答ありがとうございます。

    確かに、Imageクラスを使わないというのもひとつの手ですね。
    少し頭が固くなっていました。

    今回は素直に直接ImageMagickを使用して実装する事にしました。
    しかも、こうして直接操作すると、Imageクラスを利用するより段違いに高速で、
    -define jpeg:sizeを使わなくても充分使える速度にする事ができました。
    足並みを揃えるためか、何か内側で色々と動いているのでしょうか。

    なんにしてもお伺いして良かったです。ありがとうございました!

    キャンセル

関連した質問

同じタグがついた質問を見る

  • PHP

    20810questions

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

  • FuelPHP

    524questions

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

  • ImageMagick

    94questions

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