PHPで画像リサイズ機能を作る方法【サンプルコード付き】

php

PHPで画像リサイズ機能を作る方法

PHPで画像リサイズ機能を作る方法を紹介します。アップロードした画像を横幅800pxに自動でリサイズし、縦幅は比率を保ったままサーバーへ保存できるサンプルです。Webサイトへの画像投稿機能や商品画像の登録、容量を抑えた画像管理システムなどを作成したい場合に利用できます。

コードについて 本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。

デモ

画像リサイズフォーム
横幅800pxにリサイズして保存します。縦幅は比率を保って自動調整します。

コードをコピーして使おう!

<?php

// リサイズ後の横幅を設定します
$resize_width = 800;

// アップロード先フォルダです
$upload_dir = 'uploads';

// フォルダが存在しない場合は自動で作成します
if (!is_dir($upload_dir)) {
    mkdir($upload_dir, 0777, true);
}

$message = '';

// フォーム送信時の処理です
if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    // 画像が正常にアップロードされたか確認します
    if (
        isset($_FILES['image']) &&
        $_FILES['image']['error'] === UPLOAD_ERR_OK
    ) {

        // 画像情報を取得します
        $tmp_name = $_FILES['image']['tmp_name'];
        $image_info = getimagesize($tmp_name);

        if ($image_info !== false) {

            // MIMEタイプごとに画像を読み込みます
            switch ($image_info['mime']) {

                case 'image/jpeg':
                    $source_image = imagecreatefromjpeg($tmp_name);
                    $save_function = 'imagejpeg';
                    $extension = 'jpg';
                    break;

                case 'image/png':
                    $source_image = imagecreatefrompng($tmp_name);
                    $save_function = 'imagepng';
                    $extension = 'png';
                    break;

                case 'image/gif':
                    $source_image = imagecreatefromgif($tmp_name);
                    $save_function = 'imagegif';
                    $extension = 'gif';
                    break;

                default:
                    $source_image = false;

            }

            if ($source_image !== false) {

                // 元画像サイズを取得します
                $original_width = imagesx($source_image);
                $original_height = imagesy($source_image);

                // 横幅800px未満ならリサイズせずそのまま保存します
                if ($original_width <= $resize_width) {

                    $new_width = $original_width;
                    $new_height = $original_height;

                } else {

                    // アスペクト比を維持して高さを計算します
                    $new_width = $resize_width;
                    $new_height = intval(
                        $original_height * ($resize_width / $original_width)
                    );

                }

                // 新しい画像を作成します
                $resize_image = imagecreatetruecolor(
                    $new_width,
                    $new_height
                );

                // PNG・GIFの透過を保持します
                imagealphablending($resize_image, false);
                imagesavealpha($resize_image, true);

                // リサイズ処理を実行します
                imagecopyresampled(
                    $resize_image,
                    $source_image,
                    0,
                    0,
                    0,
                    0,
                    $new_width,
                    $new_height,
                    $original_width,
                    $original_height
                );

                // 元ファイル名を取得します
                $file_name = pathinfo(
                    $_FILES['image']['name'],
                    PATHINFO_FILENAME
                );

                // 保存先を作成します
                $save_path =
                    $upload_dir .
                    '/' .
                    $file_name .
                    '.' .
                    $extension;

                // 画像を保存します
                if ($save_function === 'imagejpeg') {

                    imagejpeg(
                        $resize_image,
                        $save_path,
                        90
                    );

                } elseif ($save_function === 'imagepng') {

                    imagepng(
                        $resize_image,
                        $save_path
                    );

                } else {

                    imagegif(
                        $resize_image,
                        $save_path
                    );

                }

                // メモリを解放します
                imagedestroy($source_image);
                imagedestroy($resize_image);

                $message = '画像を横幅800pxにリサイズしてアップロードしました。';

            } else {

                $message = 'JPEG・PNG・GIF画像を選択してください。';

            }

        } else {

            $message = '画像ファイルを選択してください。';

        }

    } else {

        $message = '画像ファイルを選択してください。';

    }

}

?>

<!DOCTYPE html>
<html lang="ja">
<head>

<meta charset="UTF-8">

<title>画像リサイズ</title>

<style>

body{
    font-family:sans-serif;
    background:#f8fafc;
    margin:40px;
}

.php-image-resize_wrap{
    max-width:600px;
    margin:0 auto;
    padding:24px;
    border:1px solid #e5e7eb;
    border-radius:18px;
    background:#ffffff;
}

.php-image-resize_title{
    font-size:22px;
    font-weight:bold;
    margin-bottom:20px;
}

.php-image-resize_field{
    display:flex;
    flex-direction:column;
    gap:6px;
    margin-bottom:14px;
}

.php-image-resize_label{
    font-weight:bold;
}

.php-image-resize_input{
    width:100%;
}

.php-image-resize_note{
    margin-bottom:14px;
    padding:12px;
    border-radius:10px;
    background:#eff6ff;
    color:#1d4ed8;
}

.php-image-resize_btn{
    width:100%;
    height:46px;
    border:none;
    border-radius:10px;
    background:#0b6bff;
    color:#ffffff;
    font-weight:bold;
    cursor:pointer;
}

.php-image-resize_result{
    margin-top:16px;
    padding:14px;
    border:1px solid #bbf7d0;
    border-radius:12px;
    background:#f0fdf4;
    color:#15803d;
}

</style>

</head>
<body>

<div class="php-image-resize_wrap">

    <div class="php-image-resize_title">
        画像リサイズフォーム
    </div>

    <div class="php-image-resize_note">
        横幅800pxにリサイズして保存します。
    </div>

    <form method="post" enctype="multipart/form-data">

        <div class="php-image-resize_field">

            <label class="php-image-resize_label">
                画像ファイル
            </label>

            <input
                class="php-image-resize_input"
                type="file"
                name="image"
                accept="image/*"
            >

        </div>

        <button
            class="php-image-resize_btn"
            type="submit"
        >
            リサイズしてアップロードする
        </button>

    </form>

    <?php if ($message !== ''): ?>

        <div class="php-image-resize_result">
            <?= htmlspecialchars($message, ENT_QUOTES, 'UTF-8') ?>
        </div>

    <?php endif; ?>

</div>

</body>
</html>

ファイル構成と設置方法

このサンプルでは、index.php を配置するだけで利用できます。リサイズ後の画像を保存する uploads フォルダは、PHP側で自動生成されます。初回実行時に uploads フォルダが存在しない場合は新しく作成され、すでに存在する場合はそのフォルダをそのまま保存先として使用します。

sample/
└── index.php

(初回実行後に自動生成)

sample/
├── index.php
└── uploads/
  

index.php をサーバーへアップロードし、ブラウザからアクセスしてください。画像ファイルを選択して送信すると、画像は横幅800px・縦幅は比率を維持したまま自動でリサイズされます。その後、同じ階層に uploads フォルダがなければ自動で作成され、リサイズ後の画像が保存されます。元画像の横幅が800px以下の場合は拡大せず、そのままのサイズで保存されます。


コメント