PHPで画像ファイル(JPG)を品質・サイズを変更してアップロードする
概要
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以降はこの関数を実行しても何も起こりません。