この PHP を指定ファイル名で呼び出すと、幅を 100px で縮小された画像を返します( 無ければ縮小画像を返します )。 ▼ 縮小 imagecopyresampled
<?php $debug = false; // ************************************* // 画像があるフォルダの相対パス // ************************************* $image_dir = 'images'; // ************************************* // QueryString より対象の // 画像ファイル名を取得 // ************************************* $file = "{$image_dir}/{$_GET['name']}"; // ************************************* // 画像が存在しない場合は、 // エラー用の画像をブラウザに返す // ************************************* if ( !file_exists( $file ) || $_GET['name'] == '' ) { header("Content-Type: image/png"); $file = "{$image_dir}/error.png"; header('Content-Length: ' . filesize($file)); readfile($file); exit(); } // ************************************* // ファイルの MIME を取得 // ************************************* $mime = image_type_to_mime_type( exif_imagetype( $file ) ); // ************************************* // ファイル名から拡張子を除いた部分を // 取得して、縮小ファイルのファイルの // パスを作成する( .jpg ) // ************************************* $path_parts = pathinfo($_GET['name']); $small_file = "{$image_dir}/s/{$path_parts['filename']}.jpg"; // ************************************* // 縮小ファイルがなければ作成して // ブラウザに返す、あればそのまま返す // ************************************* if ( !file_exists( $small_file ) ) { if ( ImageConvert( $image_dir, $_GET['name'], exif_imagetype( $file ) ) ) { header("Content-Type: image/jpeg"); header('Content-Length: ' . filesize($small_file)); readfile($small_file); } else { // 縮小に失敗した場合は、大きい元のファイルを返す header("Content-Type: {$mime}"); header('Content-Length: ' . filesize($file)); readfile($file); } } else { header("Content-Type: image/jpeg"); header('Content-Length: ' . filesize($small_file)); readfile($small_file); } // ************************************* // ファイルを縮小して保存 // ************************************* function ImageConvert( $dir, $filename, $type ) { log_print( "$dir, $filename, $type" ); // ************************************* // ファイルの属性等を取得 // ************************************* $target = getimagesize( "$dir/$filename" ); log_print( print_r($target,true) ); // 現在のサイズ $width = $target[0]; $height = $target[1]; $width_new = 100; // 幅固定 // ************************************* // 縮小後の高さを計算で求める // ************************************* $height_new = (int)( ($height/$width)*$width_new ); $target_path = "$dir/$filename"; $jpeg = false; // ************************************* // 画像の種類によって、オブジェクト作成方法を選択する // ************************************* if ( $type == 2 ) { $jpeg = @imagecreatefromjpeg( $target_path ); } if ( $type == 3 ) { $jpeg = @imagecreatefrompng( $target_path ); } if ( $type == 4 ) { $jpeg = @imagecreatefromgif( $target_path ); } if ( $jpeg === false ) { return false; } log_print( "現画像取得" ); // ************************************* // 新しい空のイメージ // ************************************* $jpeg_new = @imagecreatetruecolor( $width_new, $height_new ); if ( $jpeg_new === false ) { return false; } log_print( "新しい画像取得" ); // ************************************* // サイズ変更して新しいイメージへ転送 // ************************************* $ret = @imagecopyresampled( $jpeg_new, $jpeg, 0, 0, 0, 0, $width_new, $height_new, $width, $height ); if ( !$ret ) { return false; } log_print( "縮小完了" ); // ************************************* // JPEG ファイルとして、 // クオリティ 75 で出力 // ************************************* $path_parts = pathinfo($filename); $ret = @imagejpeg ( $jpeg_new, "$dir/s/{$path_parts['filename']}.jpg", 75 ); if ( !$ret ) { return false; } log_print( "ファイル出力完了:$dir/s/{$path_parts['filename']}.jpg" ); return true; } // ************************************* // デバッグログ // ************************************* function log_print( $msg ) { if ( !$GLOBALS['debug'] ) { return false; } file_put_contents("debug.log", $msg ,FILE_APPEND ); file_put_contents("debug.log", "\n" ,FILE_APPEND ); } ?>