あるcakePHPによるシステム構築で、画像アップロードするときにサムネイル用の画像を作成する仕組みが必要となり、cakePHP3にあうプラグインを探すより、自分で通常でできるプログラムで構築しようと考え、参考にしようとネット検索したのですが、よくある方法はImageMagickで作業する方法でした。

アップロードの仕組みもPHPで通常行う方法をとることにし、cakePHPで保存した際にサムネイル作成を実行するように考えたてみました。

Controllerの上部で、最初にImageMagickを使用する宣言を行い、その後利用するActionの中にプログラムを追加します。

その前にサーバーでImageMagickが利用できるかどうかの調査が先に必要ではありますが、今回は使用できるという想定で行います。

以下は簡単な書き方ですが、本来はもっと色々と機能があって思う通りのことが出来そうだがまだまだ知識足らず。保存する画像からサムネイルを作成する際に、別の名前で保存することを想定したプログラムになります。

// Controller上部に追記
use Imagick;

$img_dir = "/webroot/img/";
$img_name = "photo.jpg";
$img_ext = pathinfo($img_name, PATHINFO_EXTENSION);
$thumb_nae = "photo_thumb";

// サムネイル作成プログラム
$thumbnail = new \Imagick(); // Imagickオブジェクト
$thumbnail->readImage($img_dir.$img_name); // 画像パスを指定(ルートから絶対パス)
$thumbnail->cropThumbnailImage(100, 100); // 縦横のサイズ指定

// 出力フォーマットを指定
switch ($img_ext) {
    case 'PNG':
    case 'png':
        $thumbnail->setImageFormat('png');
        break;

    case 'GIF':
    case 'gif':
        $thumbnail->setImageFormat('gif');
        break;

    case 'JPEG':
    case 'JPG':
    case 'jpeg':
    case 'jpg':
    default:
        $thumbnail->setImageFormat('jpg');
        break;
}

// 画像の出力パスを指定
$thumbnail->writeImage($img_dir.$thumb_name.".".$img_ext);
 

出力フォーマットの指定はテストでは正確な指定をしなくても、読み込んだデータの拡張子のまま出力されたのを確認しました。