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

A子

B美

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

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

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

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

C菜

B美
(面倒くさいけど…(苦笑))
まずは「templates/Users」の中にある「change_image.php」ね









A子
JavaScript部分が複雑すぎる!

C菜

B美
(こっちはそんなに難しくないはず…)
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菜

A子

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

A子
(【コラム⑭】参照)

↓



C菜

A子
その赤枠の右下にある■をクリックしたまま、左上にドラッグすると赤枠のサイズが変わるね
あと、赤枠自体の移動もドラッグ&ドロップでできるみたい
んで、赤枠のサイズと位置が決まったら、「アップロード」ボタンを押してっと…


↓


C菜
なんだかすごいです~

B美
(だってあまり詳しくないし…(苦笑))

A子