FuelPHPのimageクラス

作成日:2018-01-30, 更新日:2018-01-30

使う準備

1.「fuel/core/config/image.php」を「fuel/app/config/image.php」にコピペ
2.「fuel/app/config/image.php」の「driver」を「imagick」に変更
3.「fuel/app/config/image.php」の「temp_append」を必要に応じて変更(そのままでも良い)
4.「fuel/app/config/image.php」の他の項目も必要に応じて変更(そのままでも良い)

「fuel/app/config/image.php」の「driver」について

一応、「gd」「imagemagick」「imagick」の3種類あるけど「imagick」を使う。

・GDライブラリは公式によると色々と残念らしい
・imagemagickだと、バグがあった。
ということで「imagick」を使うことにしている。

imagemagickのバグ

「\Image::load(〇〇〇)->output();」をしたときに下記のようなエラーが出力

A non well formed numeric value encountered

これは「文字列なのに数値のように計算しようとしている」っていうエラー。

調べるとimagemagick内で「md5(time() * microtime())」としているトコが原因。

・「microtime()」は文字列として出力
・「microtime(true)」にしてやるとfloat型になる

ココで原因が分かったので対策方法は下記のいずれか・・・。

A. 対象箇所を修正(対象箇所はcoreフォルダ内のimagemagickのファイル)
B. coreフォルダ内のファイルを修正するのがイヤなら継承させて読み込ませて使う
C. 継承させて読み込ませるのが面倒なら諦める。

基本的な使い方:「ドライバ」が「imagick」の場合

ファイルを読み込む
\Image::load(ファイルPATH)
        ->output();
ファイルを読み込んで別名保存
\Image::load(ファイルPATH)
        ->save(ファイル名込みで保存先のPATH);

※フォルダを先に作っておかないとエラー

ファイルを読み込んで別名保存(元のファイル名の前後に何かつける)
\Image::load(ファイルPATH)
        ->save_pa(前につける文字列, 後につける文字列); // 「zebre.png」を「aa_zebre_bb.png」とするなら「save_pa('aa_', '_bb')」
ファイルを読み込んで別名保存(元のファイル名の前に何かつける)
\Image::load(ファイルPATH)
        ->save_pa(前につける文字列); // 「zebre.png」を「aa_zebre.png」とするなら「save_pa('aa_')」
ファイルを読み込んで別名保存(元のファイル名の後ろに何かつける)
\Image::load(ファイルPATH)
        ->save_pa('', 後につける文字列); // 「zebre.png」を「zebre_bb.png」とするなら「save_pa('', '_bb')」
ファイルを読み込んでリサイズして別名保存(幅・高さ指定)
\Image::load(ファイルPATH)
        ->resize(横幅, 高さ) // 「横幅100px、高さ80px」にしたいなら「resize(100, 80)」
        ->save(ファイル名込みで保存先のPATH);
ファイルを読み込んでリサイズして別名保存(幅のみ指定:アスペクト比を保つ)
\Image::load(ファイルPATH)
        ->resize(横幅)
        ->save(ファイル名込みで保存先のPATH);

※幅のみ必須なので、高さのみ指定ってのはできないみたい。

ファイルを読み込んでリサイズして別名保存(幅のみ指定:アスペクト比は保たない)
\Image::load(ファイルPATH)
        ->resize(横幅, null, false) // 第3引数がアスペクト比。試していないので本当に動作するかは不明
        ->save(ファイル名込みで保存先のPATH);

※幅のみ必須なので、高さのみ指定ってのはできないみたい。

ファイルを読み込んでリサイズして別名保存(幅のみ指定:アスペクト比を保つ+背景色を使う)
\Image::load(ファイルPATH)
        ->resize(横幅, null, true, true) // アスペクト比を保つときのみ画像を詰めることが可能(第4引数をtrueにする)
        ->save(ファイル名込みで保存先のPATH);

※幅のみ必須なので、高さのみ指定ってのはできないみたい。

ファイルを読み込んでリサイズして別名保存(90%にする)
\Image::load(ファイルPATH)
        ->resize('90%', '90%')
        ->save(ファイル名込みで保存先のPATH);

※幅のみ必須なので、高さのみ指定ってのはできないみたい。

ファイルを読み込んでトリミングして別名保存(幅・高さ指定)
\Image::load(ファイルPATH)
        ->crop_resize(横幅, 高さ) // 「横幅100px、高さ80px」にしたいなら「crop_resize(100, 80)」
        ->save(ファイル名込みで保存先のPATH);

フォームからアップロードし、ゴニョゴニョする

「ドライバ」が「gd」じゃないからダメ。
「\Image::load()」の第2、3引数はGDしかダメらしいとのこと。

▼「ドライバ」を「gd」にするなら下記のような感じ

\Upload::process(array(
    'path' => DOCROOT.DS.'files'
));

if (\Upload::is_valid()) {
    $data = Upload::get_files(0);
    
    // アップロードデータのファイルを使い、
    // $force_extension として画像の拡張子を強制することができる。
    Image::load($data['file'], false, $data['extension'])
        ->crop_resize(200, 200)
        ->save('image');
}

代案

アップロードした際にファイル名を取得して、保存先のPATHからloadしてやればOK。

公式

FuelPHP1.7 Imgaeクラス