PHP×GD フォームからアップロード時に比率を変えずにリサイズ ITかあさん

ITかあさん

PHP×GD フォームからアップロード時に比率を変えずにリサイズ

PHP×GD フォームからアップロード時に比率を変えずにリサイズ

PHP×GD 比率を変えずに画像をリサイズ

今回のミッション!

PHP×GDで、フォームからアップロードされた画像を引き伸ばしなどされず比率を維持したままリサイズしつつ、
比率を維持した結果足りない部分は背景画像で補う!

と、いうのが今回のミッションです。

リサイズ例

希望した比率と合わないものは余白をつける
こんな風に、希望した比率と合わないものは、余白をつけ、1pxのずれもなく、希望通りの画像サイズになるようにGDを駆使します。

GDとは、画像をいい感じにリサイズしたり、フィルタをかけたり、Photoshopみたくレイヤー重ねたりしちゃうPHPのライブラリのことです。

画像アップロード用のフォーム

アップロード用のフォームはこんな感じ。
ファイルアップロードのフォームにはmultipart/form-dataをお忘れなく
(さっきうっかりフォームにmultipart/form-dataを入れ忘れて、アップロードされない!って焦りましたw)

<form method="post" name="company" action="./upload.php" enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit" value="決定" />
</form>

アップロードされた画像を比率維持したままリサイズする upload.php

では、比率を維持したまま、リサイズしつつ、比率維持したことで足りない部分は白い画像で埋めるやり方です。

ポイント

余白がいくつ欲しい!と考えるのではなく、『絶対にこの大きさのサイズの画像を作りたい!』という画像を呼び出し、
その後リサイズした画像を下に敷くイメージで画像を作成すれば、確実に欲しい大きさの画像が作れます
  $dir = "./upload/";	//アップロード用のディレクトリ
if (is_uploaded_file(@$_FILES["image"]["tmp_name"])) {
  // ファイル名の文字コードを変換する
  $file1 = $dir.$_FILES["image"]["name"];
  // テンポラリファイルを保存ディレクトリにコピー
  copy($_FILES["image"]["tmp_name"],$file1);
  $rename = "image.jpg";
  rename("$file1",$dir.$rename);
  }
 $file1 = $dir.$rename;                        // 元画像ファイル
  
  $in = ImageCreateFromJPEG($file1);                        // 元画像ファイル読み込み
  $size = GetImageSize($file1);                            // 元画像サイズ取得
  
  
  $width = 300;                                // リサイズしたい画像サイズ(width)
  $height = 400;                                // リサイズしたい画像サイズ(height)
 
  
  $ratio_orig = $size[0]/$size[1];//元画像の比率計算
 
/*画像の比率を計算する*/
  if ($width/$height > $ratio_orig) {
  $width = $height*$ratio_orig;
  } else {
  $height = $width/$ratio_orig;
  }

/*画像の生成ここから*/ 
  $out = ImageCreateTrueColor($width, $height);
  ImageCopyResampled($out, $in, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);    // サイズ変更・コピー 
  
  //出力先の画像を作成
  // 画像ファイル読み込み(ベース画像)
  //もしリサイズしたい画像の大きさが300px×400pxなら、その大きさの画像を準備
  $img = ImageCreateFromJPEG("./white.jpg");
ImageCopy($img, $out, 0, 0,  0,0, $width, $height); //ベース画像にアップロードしたリサイズ画像を合体させる
  ImageJPEG($img, $file1);                            //最後に合体した画像を保存して終了

//メモリ開放
  ImageDestroy($in);
  ImageDestroy($out);
  ImageDestroy($img);
初夏のJavaScript祭 in サーキュレーションビル ForPro