Friction River Software

  • お問い合わせ

CakePHP5入門【CakePHP5実用編⑮】アイコン画像のサイズ変更

A子

ねぇねぇ、人物アイコン画像のサイズ(縦横のドット数)って、今のところ特に制限してないじゃん

B美

そうね

C菜

大きなサイズの画像をアップロードした場合って、そのままのサイズでアイコン画像が生成されてますね~

表示上は、100ドット×100ドットのサイズになってますけど~

A子

例えばさぁ

デジカメやスマホで撮影した大きなサイズの写真画像の中から特定の領域を切り出して、それを100ドット×100ドットに縮小してからアイコン画像として保存する…なんてことはできないの?

B美

Windows付属の「ペイント」でやれば良いじゃない

そんなに難しくはないわよ

A子

ふたもねぇ(笑)

いや、このWebアプリケーション上でできないのかってこと

C菜

そういうWebサイトがあったような気もするです~

B美

まぁ、やろうと思えばできるわよ
(面倒くさいけど…(苦笑))

まずは「templates/Users」の中にある「change_image.php」ね








A子

うへぇ
JavaScript部分が複雑すぎる!

C菜

たしかに「面倒くさい」かもです~

B美

「src/Controller」の中にある「UsersController.php」の「changeImage」メソッドについては、次のように書き換えてね
(こっちはそんなに難しくないはず…)

public function changeImage()
{
    if ($this->request->is('post')) {
        $upload = $this->request->getData('upload');

        $rect_x = intval($this->request->getData('rect_x'));
        $rect_y = intval($this->request->getData('rect_y'));
        $rect_size = intval($this->request->getData('rect_size'));


        //オリジナルのファイル名を取得
        $original_filename = $upload->getClientFilename();

        if ($original_filename != '') {
            $extension = mb_strtolower(pathinfo($original_filename, PATHINFO_EXTENSION)); //拡張子

            if ($extension == 'jpg' || $extension == 'jpeg' || $extension == 'gif' || $extension == 'png') {
                //一時ファイルのパス
                $temp_path = $upload->getStream()->getMetadata('uri');

                //画像形式に応じて画像作成
                switch ($extension) {
                    case 'jpg':
                    case 'jpeg':
                        $image = imagecreatefromjpeg($temp_path);
                        break;
                    case 'gif':
                        $image = imagecreatefromgif($temp_path);
                        break;
                    case 'png':
                        $image = imagecreatefrompng($temp_path);
                        break;
                    }

                //PNG画像の作成
                if ($image != null) {
                    //100×100ドットの画像を作成し、元ファイルの指定領域をコピーする
                    $newimage = imagecreatetruecolor(100, 100);
                    imagecopyresampled($newimage, $image, 0, 0, $rect_x, $rect_y, 100, 100, $rect_size, $rect_size);


                    $webroot = WWW_ROOT;
                    $dst = $webroot.'personal'.DS.$this->identity->id.'.png';
                    if (imagepng($newimage, $dst)) {
                        $this->Flash->success(__('人物アイコン画像を変更しました。'));
                    } else {
                        $this->Flash->error(__('人物アイコン画像の変更に失敗しました。'));
                    }

                    //画像データの破棄
                    imagedestroy($image);
                    imagedestroy($newimage);
                }

                return $this->redirect(['controller' => 'Top', 'action' => 'index']);
            }
        }
    }
}

要するに、「imagecreatetruecolor」関数で新規に画像を生成したら、そこに「imagecopyresampled」関数で指定された領域をコピーするの

あとは、PNGファイルとして保存(imagepng)したら、忘れずに画像データを破棄(imagedestroy)するだけね


A子

うーん

imagecopyresampled」関数ってめっちゃ引数が多いけど、PHPライブラリのマニュアルサイトを見ればなんとなく使い方が分かるし、B美が書いたコードと突き合わせてみたら、もっとよく理解できた…気がするよ

B美

「気がする」だけかよ(笑)

でもまぁ、なかなか良い姿勢ね
そうやって、こつこつ経験値を積み重ねていくのがプログラム学習の王道よ
(なんでもかんでも一度で理解できるとは思わないように!)

C菜

そういう意味では、さきほどのJavaScriptのコードなんて、理解するのはかなり大変そうです~(苦笑)

A子

たしかに…(苦笑)

B美

それはともかくとして…

想定通りに動作するかどうか、きちんと検証してみてね

A子

んじゃ、前回強制的にデフォルト画像に戻された私がやってみるよ(苦笑)
(【コラム⑭】参照)




C菜

正方形の赤枠が表示されてますね~

A子

だね

その赤枠の右下にあるをクリックしたまま、左上にドラッグすると赤枠のサイズが変わるね
あと、赤枠自体の移動もドラッグ&ドロップでできるみたい

んで、赤枠のサイズと位置が決まったら、「アップロード」ボタンを押してっと…




C菜

ばっちり変わりましたね~

なんだかすごいです~

B美

正直に言うと、JavaScriptの部分ってChatGPTに教えてもらったんだけどね
(だってあまり詳しくないし…(苦笑))

A子

さっきまで「すっげぇ」って、めっちゃ感心してた…ってのに(笑)