【PHP8.x】getimagesize関数の使い方

getimagesize関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

getimagesize関数は、指定された画像ファイルのサイズとタイプに関する情報を取得する関数です。この関数は、画像が実際に存在するファイルであるかどうかを確認し、その画像の幅や高さ、ファイル形式、そしてHTMLの<img>タグで利用できるwidthheight属性の文字列、さらにMIMEタイプなどの詳細なデータを提供します。

具体的には、画像のピクセル単位での幅と高さ、JPEGやPNG、GIFといった画像の種類を示す定数、ウェブページで画像の表示に役立つHTML形式のサイズ情報、そして画像のMIMEタイプ(例: image/jpeg)を配列として返します。この配列には、幅がインデックス0、高さがインデックス1、画像タイプがインデックス2、HTML属性文字列がインデックス3に格納され、mimeキーでMIMEタイプが提供されます。

この機能は、ウェブアプリケーションで画像をアップロードする際の検証処理や、動的に画像のサイズを調整して表示する場合に非常に有用です。例えば、ユーザーがアップロードした画像が指定されたサイズ制限内であるかを確認したり、ウェブページに表示する画像のwidthおよびheight属性を自動で設定したりする際に利用できます。ファイルパスが不正である場合や、指定されたファイルが有効な画像ファイルではない場合には、この関数はfalseを返してエラーを示します。

構文(syntax)

1<?php
2$filename = 'path/to/your/image.jpg';
3$extra_info = []; // オプションで画像に関する追加情報を格納する配列
4
5$image_details = getimagesize($filename, $extra_info);
6?>

引数(parameters)

string $filename, array &$image_info = null

  • string $filename: 画像ファイルのパスを指定する文字列
  • array &$image_info = null: 画像の情報が格納される配列(参照渡し)

戻り値(return)

array|false

指定された画像ファイルのサイズ情報、カラータイプ、およびMIMEタイプを含む連想配列を返します。画像ファイルが破損している、またはサポートされていない形式である場合はfalseを返します。

サンプルコード

PHP getimagesize関数で画像情報を取得する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * getimagesize() 関数の使い方を示すサンプル関数です。
7 *
8 * この関数は、画像の情報を取得する成功例と、
9 * 存在しないファイルで失敗する例の両方を実行します。
10 * 単体で動作するように、画像データはコード内に埋め込んでいます。
11 */
12function demonstrateGetImageSize(): void
13{
14    // --- 成功例 ---
15    // Data URI スキームを使用した1x1ピクセルのPNG画像データ。
16    // これにより、実際の画像ファイルがなくてもコードを試すことができます。
17    $validImageUri = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
18
19    echo "--- 成功例の実行 ('Data URI') ---" . PHP_EOL;
20    // @演算子は、ファイルが見つからない等の警告を抑制し、戻り値でエラーをハンドリングするためのお作法です。
21    $imageInfo = @getimagesize($validImageUri);
22
23    // getimagesize() は成功すると画像の情報を配列で、失敗すると false を返します。
24    if ($imageInfo !== false) {
25        // 取得した配列から情報を抽出します。
26        // PHP 7.1以降は連想キー ($imageInfo['width']) も利用できます。
27        $width  = $imageInfo[0];
28        $height = $imageInfo[1];
29        $mime   = $imageInfo['mime'];
30
31        echo "幅: {$width}px" . PHP_EOL;
32        echo "高さ: {$height}px" . PHP_EOL;
33        echo "MIMEタイプ: {$mime}" . PHP_EOL;
34    } else {
35        echo "画像情報の取得に失敗しました。" . PHP_EOL;
36    }
37    echo PHP_EOL; // 見やすくするための改行
38
39
40    // --- 失敗例 ---
41    // 存在しないファイルパスを指定します。
42    $invalidFilePath = 'path/to/non_existent_image.jpg';
43
44    echo "--- 失敗例の実行 ('{$invalidFilePath}') ---" . PHP_EOL;
45    $errorInfo = @getimagesize($invalidFilePath);
46
47    if ($errorInfo === false) {
48        // 意図通り false が返ってくることを確認します。
49        echo "画像情報の取得に失敗しました。" . PHP_EOL;
50        echo "(ファイルが存在しないか、サポートされていない形式のため)" . PHP_EOL;
51    } else {
52        echo "予期せず画像情報が取得されました。" . PHP_EOL;
53    }
54}
55
56// サンプル関数を実行します。
57demonstrateGetImageSize();

PHPのgetimagesize関数は、画像ファイルのサイズ(幅と高さ)や形式(MIMEタイプ)などの情報を取得するための関数です。第一引数に、情報を取得したい画像ファイルのパスやURLを文字列として指定します。

この関数の戻り値は、処理が成功したか失敗したかによって異なります。画像の情報を正しく取得できた場合は、幅、高さ、MIMEタイプといった情報を含む配列を返します。一方で、指定されたファイルが存在しない、またはPHPがサポートしていない画像形式だった場合にはfalseを返します。

サンプルコードでは、この関数の成功例と失敗例を具体的に示しています。成功例では、Data URIスキームという形式でコード内に直接埋め込まれたPNG画像の情報を取得し、その幅、高さ、MIMEタイプを表示しています。失敗例では、意図的に存在しないファイルパスを指定することで、関数がfalseを返し、画像情報の取得に失敗する様子を確認できます。なお、関数呼び出しの先頭にある@記号は、ファイルが見つからない等の警告メッセージの出力を抑制し、戻り値がfalseであるかどうかでエラーを判断するための一般的な手法です。

getimagesize関数は、ファイルが見つからない場合などに警告を発生させます。サンプルにある@演算子は、この警告表示を抑制し、プログラム側でエラー処理を行うためのお作法です。そのため、戻り値がfalseかどうかを!=====で必ずチェックし、失敗時の処理を実装することが重要です。この関数はファイルパスだけでなくURLも引数に指定できますが、ユーザーがアップロードしたファイルなどを扱う際は、意図しないファイルへのアクセスを防ぐため、パスを検証するなどのセキュリティ対策が必要です。戻り値の配列には画像の幅や高さの他にMIMEタイプも含まれており、アップロードされたファイルが本当に画像かどうかの判定にも利用できます。

PHP getimagesize 失敗の原因を調べる

1<?php
2
3/**
4 * 指定されたファイルの画像サイズ情報を安全に取得します。
5 * getimagesize() が失敗する一般的なケースを処理し、原因を特定します。
6 *
7 * @param string $filePath 画像ファイルへのパスまたはURL。
8 * @return void
9 */
10function displayImageSizeInfo(string $filePath): void
11{
12    echo "--- チェック対象: '{$filePath}' ---" . PHP_EOL;
13
14    // file_exists() はローカルファイルにのみ有効。URLの場合は常にfalseを返す。
15    // そのため、まずはURLかどうかを判定する。
16    $isUrl = filter_var($filePath, FILTER_VALIDATE_URL);
17
18    // ローカルファイルの場合、存在と読み取り権限を確認する
19    if (!$isUrl) {
20        if (!file_exists($filePath)) {
21            echo "結果: 失敗 (原因: ローカルファイルが存在しませんでした)" . PHP_EOL;
22            return;
23        }
24        if (!is_readable($filePath)) {
25            echo "結果: 失敗 (原因: ローカルファイルの読み取り権限がありませんでした)" . PHP_EOL;
26            return;
27        }
28    }
29
30    // getimagesize() が失敗した場合に E_WARNING が発生するのを抑制するため、
31    // エラー制御演算子(@)を使用します。エラーハンドリングは戻り値で行います。
32    // タイムアウトを設定するためにストリームコンテキストを使用することもできます。
33    $context = stream_context_create([
34        'http' => [
35            'timeout' => 5, // タイムアウトを5秒に設定
36        ],
37    ]);
38    $imageInfo = @getimagesize($filePath, [], $context);
39
40    // getimagesize() は、情報の取得に失敗した場合に false を返します。
41    // === を使って厳密に比較することが重要です。
42    if ($imageInfo === false) {
43        echo "結果: 失敗 (原因: 画像として認識できない、またはリモートサーバーから取得できませんでした)" . PHP_EOL;
44        if ($isUrl) {
45            echo "補足: URLの場合、allow_url_fopenディレクティブがphp.iniで有効になっている必要があります。" . PHP_EOL;
46        }
47        return;
48    }
49
50    // 成功した場合、取得した情報を表示
51    echo "結果: 成功" . PHP_EOL;
52    echo "  幅: " . $imageInfo[0] . "px" . PHP_EOL;
53    echo "  高さ: " . $imageInfo[1] . "px" . PHP_EOL;
54    echo "  MIMEタイプ: " . $imageInfo['mime'] . PHP_EOL;
55}
56
57// --- 実行例 ---
58
59// 1. 存在しないファイルのパスを指定した場合
60$nonExistentFile = 'path/to/non_existent_image.jpg';
61displayImageSizeInfo($nonExistentFile);
62echo PHP_EOL;
63
64// 2. 画像ではないファイルのパスを指定した場合
65$notAnImageFile = 'not_an_image.txt';
66// テスト用に空のテキストファイルを作成
67file_put_contents($notAnImageFile, 'This is not an image.');
68displayImageSizeInfo($notAnImageFile);
69unlink($notAnImageFile); // テスト用ファイルを削除
70echo PHP_EOL;
71
72// 3. 存在しないURLを指定した場合 (ネットワーク状況により時間がかかることがあります)
73//    php.iniで allow_url_fopen=On が設定されている必要があります。
74$invalidUrl = 'https://example.com/invalid-image.png';
75displayImageSizeInfo($invalidUrl);
76echo PHP_EOL;
77
78// 4. 正常に取得できるケース (1x1の透過GIF画像をデータURIで指定)
79$validImageUri = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
80displayImageSizeInfo($validImageUri);
81
82?>

PHPのgetimagesize関数は、引数で指定した画像ファイルの幅、高さ、MIMEタイプといった情報を取得します。第一引数には、ローカルファイルのパスまたはインターネット上の画像のURLを文字列で指定します。関数が成功すると画像の情報を格納した配列を返し、失敗した場合はfalseを返します。このため、戻り値を=== falseのように厳密に比較して、処理の成否を判定することが重要です。

このサンプルコードは、getimagesizeが失敗する、つまり画像情報を取得できない一般的な原因とその対処法を示しています。例えばローカルファイルの場合、file_exists関数でファイルの存在を、is_readable関数で読み取り権限を事前に確認しています。指定したファイルがPHPで認識できない画像形式だった場合も失敗の原因となります。

対象がURLの場合は、サーバーにアクセスできなかったり、PHPの設定ファイル(php.ini)にあるallow_url_fopenという設定項目が有効でなかったりすると情報を取得できません。サンプルコードでは、getimagesizeが失敗した際に警告メッセージが表示されるのを防ぐため、関数の前にエラー制御演算子@を付けています。これにより、プログラムの実行を妨げることなく、戻り値によるエラーハンドリングに集中できます。このように、事前に原因となりうる箇所を確認することで、なぜ画像情報を取得できないのかを正確に把握できます。

getimagesize関数は、ファイルが存在しない、読み取り権限がない、または画像形式でない場合に失敗します。安全に使うには、ローカルファイルの場合、事前に関数の実行前に存在と権限を確認することが重要です。この関数は失敗時に警告を出すため、サンプルコードのようにエラー制御演算子@で警告を抑制し、戻り値がfalseであるかを厳密な比較===で判定するのが良い方法です。URLを指定してリモート画像を取得する場合は、サーバー設定でallow_url_fopenが有効になっている必要があります。また、ネットワークの問題に備えてタイムアウトを設定しておくと、より安定したプログラムになります。

関連コンテンツ