[PHP]getimagesize関数完全攻略:画像処理の基本から応用まで

PHP

こんにちは!今回はPHPで画像処理を行う際に非常に便利な関数「getimagesize」について詳しく解説します。この関数は画像のサイズだけでなく、様々な情報を取得できる多機能ツールです。実際の使い方から応用例まで、じっくり見ていきましょう。

getimagesize関数とは?

getimagesize関数は、PHPの標準関数で、画像ファイルのサイズ(幅・高さ)やタイプなどの情報を取得することができます。ファイルアップロードの検証や、画像表示の最適化など、様々な場面で活躍します。

基本的な使い方

$imageInfo = getimagesize('example.jpg');
if ($imageInfo) {
    echo "幅: " . $imageInfo[0] . "px<br>";
    echo "高さ: " . $imageInfo[1] . "px<br>";
    echo "画像タイプ: " . $imageInfo[2] . "<br>";
    echo "width/heightタグ: " . $imageInfo[3] . "<br>";
    echo "MIMEタイプ: " . $imageInfo['mime'] . "<br>";
}

戻り値の詳細解説

getimagesize関数は以下の情報を含む配列を返します:

  • $imageInfo[0] – 画像の幅(ピクセル単位)
  • $imageInfo[1] – 画像の高さ(ピクセル単位)
  • $imageInfo[2] – 画像の種類を表す数値(1=GIF, 2=JPG, 3=PNG, 6=BMP など)
  • $imageInfo[3] – HTML img タグに使用可能な “width=xxx height=yyy” という文字列
  • $imageInfo['bits'] – ビット深度(オプション)
  • $imageInfo['channels'] – RGB画像の場合は3、CMYK画像の場合は4(オプション)
  • $imageInfo['mime'] – MIMEタイプ(例:”image/jpeg”)

実践的な活用例

1. 画像アップロード時の検証

ユーザーがアップロードしたファイルが実際に画像であるかを確認する際に使用できます:

if (isset($_FILES['upload'])) {
    $tempFile = $_FILES['upload']['tmp_name'];
    
    // 画像かどうかをチェック
    $imageInfo = getimagesize($tempFile);
    if ($imageInfo === false) {
        echo "アップロードされたファイルは画像ではありません。";
    } else {
        // 画像の種類ごとに処理を分ける
        switch ($imageInfo[2]) {
            case IMAGETYPE_JPEG:
                echo "JPEGがアップロードされました。";
                break;
            case IMAGETYPE_PNG:
                echo "PNGがアップロードされました。";
                break;
            case IMAGETYPE_GIF:
                echo "GIFがアップロードされました。";
                break;
            default:
                echo "サポートされていない画像形式です。";
        }
    }
}

2. レスポンシブなHTMLの生成

画像の縦横比を維持しながら表示する際に役立ちます:

function createResponsiveImage($imagePath, $maxWidth = 600) {
    $info = getimagesize($imagePath);
    if (!$info) return false;
    
    $width = $info[0];
    $height = $info[1];
    $aspectRatio = $height / $width;
    
    // 画像が大きすぎる場合は縮小
    if ($width > $maxWidth) {
        $width = $maxWidth;
        $height = $width * $aspectRatio;
    }
    
    $img = "<img src='$imagePath' width='$width' height='$height' class='responsive-img'>";
    return $img;
}

echo createResponsiveImage('large-image.jpg');

3. 画像ギャラリーの作成

ディレクトリ内の画像を自動的に読み込んでサムネイルを作成する例:

function createGallery($directory) {
    $html = '<div class="gallery">';
    $files = glob($directory . '/*.{jpg,jpeg,png,gif}', GLOB_BRACE);
    
    foreach ($files as $file) {
        $info = getimagesize($file);
        if ($info) {
            $filename = basename($file);
            $thumbnail = "$directory/thumbs/$filename";
            
            // サムネイルのサイズ情報を取得
            $thumbInfo = getimagesize($thumbnail);
            
            $html .= '<div class="gallery-item">';
            $html .= "<a href='$file'>";
            $html .= "<img src='$thumbnail' width='{$thumbInfo[0]}' height='{$thumbInfo[1]}' alt='$filename'>";
            $html .= '</a>';
            $html .= '</div>';
        }
    }
    
    $html .= '</div>';
    return $html;
}

注意点と制限事項

  1. リモートファイル: URLを指定して使用することもできますが、allow_url_fopen設定が有効である必要があります。
  2. メモリ使用量: 非常に大きな画像に対して使用すると、メモリ不足エラーが発生する可能性があります。
  3. サポートされている形式: JPEG、GIF、PNG、BMP、WBMP、XBM形式に対応していますが、WebPなどの新しい形式はPHPのバージョンによってサポートが異なります。
  4. エラーハンドリング: ファイルが存在しない場合や画像でない場合はFALSEを返すため、必ずチェックしましょう。

応用例:シンプルな画像分析ツール

function analyzeImage($imagePath) {
    $info = getimagesize($imagePath);
    if (!$info) return "ファイルが存在しないか、画像ではありません。";
    
    $filesize = filesize($imagePath);
    $kb = round($filesize / 1024, 2);
    
    $types = [
        IMAGETYPE_GIF => "GIF",
        IMAGETYPE_JPEG => "JPEG",
        IMAGETYPE_PNG => "PNG",
        IMAGETYPE_BMP => "BMP",
        IMAGETYPE_WEBP => "WebP"
    ];
    
    $type = isset($types[$info[2]]) ? $types[$info[2]] : "不明";
    
    $result = [
        'filename' => basename($imagePath),
        'width' => $info[0],
        'height' => $info[1],
        'type' => $type,
        'mime' => $info['mime'],
        'filesize' => $kb . "KB",
        'aspect_ratio' => round($info[0] / $info[1], 2)
    ];
    
    // ビット深度が取得できる場合
    if (isset($info['bits'])) {
        $result['bit_depth'] = $info['bits'];
    }
    
    // カラーチャンネル数が取得できる場合
    if (isset($info['channels'])) {
        $result['channels'] = $info['channels'];
    }
    
    return $result;
}

$analysis = analyzeImage('sample.jpg');
echo "<pre>";
print_r($analysis);
echo "</pre>";

まとめ

getimagesize関数は、シンプルな見た目に反して非常に多機能なPHPの画像処理関数です。画像のサイズだけでなく、形式やMIMEタイプなど様々な情報を取得できるため、ウェブサイトでの画像処理に欠かせないツールとなっています。

特に画像アップロード機能を実装する際の検証や、レスポンシブなウェブデザインを作成する際に役立つので、PHPで画像を扱う際はぜひ活用してみてください!

みなさんはこの関数をどのように活用していますか?コメント欄でシェアしていただけると嬉しいです。

タイトルとURLをコピーしました