PHPで画像ファイル(JPG)を品質・サイズを変更してアップロードする

2024年11月10日

phpで画像ファイルをアップロードする

概要

phpでjpgファイルをアップロードするプログラム例です。サイズ変更と品質変更し、同時にサムネイルもアップロードできるようにします。

アップロードできる画像ファイルはjpgのみ、サイズは横640px以上、縦480px以上。品質は85設定、サムネイルサイズは横128pxとしました。

PHP8.00以降は少し仕様が変更になったので、以前から使っていたものを見直してみたものです。

☆☆デモはこちら☆☆

ファイル構成

  img_up01.php   画像選択フォーム
  img_up02.php   画像の処理とアップロード
  img_up03.php   アップロードされた画像の表示   
  images(dir)     画像ファイルの保存ディレクトリ
  css(dir)        スタイルシート保存ディレクトリ
  ┗ style_demo.css  スタイルシート
 

img_up01.php

画像選択のフォームを表示します。ファイル選択の場合には、enctype="multipart/form-data" を記述しておかなければなりません。(主要な部分のみ記述しています)


<form action="img_up02.php" method="post" name="FormName" enctype="multipart/form-data">
<div class="form_area">
	<p>画像ファイルを選んでください</p>
	<p><input type="file" name="up_img" value="参照" ></p>
	<p><input type="submit" name="submit" value="送信"></p>
</div>
</form>
 

img_up02.php

画像の品質・サイズの変更、サムネイル用画像の生成をし、保存ディレクトリにアップロードします。


// 定数
$_IMG_MIN_WIDTH	= 640; 	  // 幅の最低サイズ/ 変更サイズ
$_IMG_MIN_HEIGT	= 480;	  // 高さの最低サイズ/変更サイズ
$_THUMBNAIL_WIDTH = 128;  // サムネイル画像横サイズ
$_JPG_QUALITY=85;     // jpgファイルの品質 低いと荒れる
$_SAVE_DIR='./images/';	  // ファイルの保存先ディレクトリ

if($_SERVER["REQUEST_METHOD"]=="POST"){	   // POSTされたデータをセットする
  $file1 = $_FILES["up_img"]["tmp_name"];  // 元画像ファイル
}
if(!$file1){
  header("Location: img_up01.php"); // ファイルがPOSTされてない場合には選択画面へ遷移
	exit();
}

// ===============================================================
if ($file1 !== "" ) {	// ファイルが空でなかったら
  $_IMG_PREFIX = Make_Rand_Str(8) ;	       // 8桁のランダムな文字列を取得
  $_SaveFileNameL = $_SAVE_DIR.$_IMG_PREFIX."-L.jpg";	// ファイル名の生成
  $_SaveFileNameS = $_SAVE_DIR.$_IMG_PREFIX."-S.jpg";	// サムネイル名の生成

  $image_type = exif_imagetype($file1);	  // 画像タイプを判定
    	
  if($image_type === IMAGETYPE_JPEG){    // jpgファイルなら
    $im = imagecreatefromjpeg($file1);   // 元画像ファイル読み込み
    $width  = imagesx($im);              // 画像の幅を取得
    $height = imagesy($im);              // 画像の高さを取得

    $min_width 	= $_IMG_MIN_WIDTH;       // 幅の最低サイズ (定数を代入してるだけです)
    $min_height	= $_IMG_MIN_HEIGT;       // 高さの最低サイズ

    if($width >= $min_width || $height >= $min_height)
      if($width === $height) {                  // 正方形の場合
          $new_width = $min_width;
          $new_height = $min_width;
       } else if($width > $height) {           // 横長の場合
          $new_width = $min_width;
          $new_height = $height*($min_width/$width);
        } else if($width < $height) {          // 縦長の場合
           $new_width = $width*($min_height/$height);
           $new_height = $min_height;
        }

        // 画像生成
        $resize_image = imagecreatetruecolor((int)$new_width, (int)$new_height);	
              // 計算された長さをintにキャストするのを忘れないように
        imagecopyresampled( $resize_image, $im,0,0,0,0, (int)$new_width, (int)$new_height, $width, $height);
        imageJPEG( $resize_image,$_SaveFileNameL,$_JPG_QUALITY); // 圧縮品質指定
	
        // サムネイル画像生成
        $_thumbnail_width = $_THUMBNAIL_WIDTH;	// サムネイル画像横サイズ
        $_thumbnail_height = $new_height *($_thumbnail_width / $new_width);// サムネイル画像縦サイズの計算

        $thumbnail_image = imagecreatetruecolor((int)$_thumbnail_width , (int)$_thumbnail_height);
        imagecopyresampled($thumbnail_image, $im,0,0,0,0,(int)$_thumbnail_width, (int)$_thumbnail_height, $width, $height);
        imagejpeg($thumbnail_image, $_SaveFileNameS,$_JPG_QUALITY);// 圧縮品質指定

     } else {
        echo "サイズが幅".$min_width."×高さ".$min_height."以上の画像をご用意ください";
        print("<p><a href=\"img_up01.php\" target=\"_self\">了解しました</a></p>");
        exit();
      }
   } else {
      echo "JPG画像のみご利用いただけます";
      print("<p><a href=\"img_up01.php\" target=\"_self\">了解しました</a></p>");
      exit();
    }
 }else{
    print("画像が選択されていません!!<br>");
}

アップロードのフォーム部分


<form action="img_up03.php" method="post" name="FormName" enctype="multipart/form-data">
<?php
print <<< FORM
  <img border="0" src="$_SaveFileNameL" width="320" >  <!-- イメージを出力 -->
  <br>$_SaveFileNameL<br>$_SaveFileNameS<br>           <!-- ファイル名を出力 -->
 <input type="hidden" name="img01" value="$_SaveFileNameL">
 <input type="hidden" name="img02" value="$_SaveFileNameS">
FORM;
?>
<button type="submit">アップロード</button>
</form>
 

ランダムな文字列を生成する関数


function Make_Rand_Str($length) {
    $str = array_merge(range('a', 'z'), range('0', '9'), range('A', 'Z'));
    $r_str = null;
    for ($i = 0; $i < $length; $i++) {
        $r_str .= $str[rand(0, count($str) - 1)];
    }
    return $r_str;
}
 

img_up03.php

アップロードされた画像を表示します。


if($_SERVER["REQUEST_METHOD"]=="POST"){	// POSTされたデータをセットする
  $_IMG01 = filter_input( INPUT_POST,"img01" ); // イメージファイル
  $_IMG02 = filter_input( INPUT_POST,"img02" ); // イメージファイル(サムネイル)
}
 
if($_IMG01 === "" || $_IMG02 === ""){
  header("Location: ./img_up01.php");	// 遷移する
  exit();
}

// アップロードされた画像ファイルの表示
print <<< IMAGE_OUT
  <div class="img01"><img border="0" src="$_IMG01"></div>
  <img border="0" src="$_IMG02"
IMAGE_OUT;
 
imagedestroy()関数について
PHP 8.0.0 より前のバージョンでは、 imagedestroy() は画像 image を保持するメモリを解放していましたが、PHP 8.0.0以降はこの関数を実行しても何も起こりません。

PC-Life,PHP

Posted by pman-bros