【PHP8.x】getimagesize()関数の使い方
getimagesize関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getimagesize関数は、指定された画像ファイルのサイズとタイプに関する情報を取得する関数です。この関数は、画像が実際に存在するファイルであるかどうかを確認し、その画像の幅や高さ、ファイル形式、そしてHTMLの<img>タグで利用できるwidthとheight属性の文字列、さらに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: 文字列から画像情報を取得する
1<?php 2 3/** 4 * 文字列データから画像情報を取得します。 5 * 6 * getimagesize 関数は通常ファイルパスを引数に取りますが、 7 * `data://` ストリームラッパーを使用することで、メモリ上の画像データから情報を取得できます。 8 * これは、`file_get_contents()` で読み込んだ画像データや、 9 * データベースから取得した画像バイナリデータに対して特に有用です。 10 * 11 * @param string $imageData 画像のバイナリデータ (例: file_get_contents で読み込んだデータ) 12 * @param array|null &$imageInfo 検出された画像情報の詳細を格納する配列 (オプション)。 13 * getimagesize関数に渡される &$image_info と同じです。 14 * @return array|false 画像の幅、高さ、種類、MIMEタイプ、HTML属性などを含む配列、失敗した場合は false 15 */ 16function getimagesize_from_string(string $imageData, ?array &$imageInfo = null): array|false 17{ 18 // 画像データをBase64エンコードし、data:// ストリームラッパー形式のURIを作成します。 19 // PHPのgetimagesizeは、data:// URI のMIMEタイプが省略されていても、 20 // バイナリデータからMIMEタイプを自動的に判別しようとします。 21 $base64EncodedData = base64_encode($imageData); 22 $dataUri = 'data:;base64,' . $base64EncodedData; 23 24 // getimagesize 関数に data:// URI を渡し、画像情報を取得します。 25 return getimagesize($dataUri, $imageInfo); 26} 27 28// --- 使用例 --- 29 30// サンプルとして、1x1ピクセルの透明なPNG画像のバイナリデータを準備します。 31// 実際には、ファイルから読み込むか、DBから取得したバイナリデータを渡します。 32// 例: $imageData = file_get_contents('path/to/your/image.jpg'); 33$samplePngData = base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII='); 34 35// 画像情報取得の試行 36$imageDetails = []; // オプションの$imageInfo引数 37$result = getimagesize_from_string($samplePngData, $imageDetails); 38 39if ($result !== false) { 40 echo "画像情報が見つかりました:\n"; 41 echo " 幅: " . $result[0] . "px\n"; 42 echo " 高さ: " . $result[1] . "px\n"; 43 echo " MIMEタイプ: " . $result['mime'] . "\n"; 44 // $imageDetails には、IPTCやEXIFデータなどの追加情報が含まれる場合があります 45 // print_r($imageDetails); 46} else { 47 echo "画像情報を取得できませんでした。データが不正であるか、画像形式がサポートされていません。\n"; 48} 49 50// 不正なデータでの例 51$invalidData = "This is not valid image data."; 52$invalidResult = getimagesize_from_string($invalidData); 53 54if ($invalidResult === false) { 55 echo "\n不正なデータのため、画像の情報を取得できませんでした。\n"; 56}
このサンプルコードは、PHPのgetimagesize関数を活用し、ファイルパスではなく、メモリ上の画像バイナリデータから直接画像情報を取得するgetimagesize_from_string関数を定義しています。標準のgetimagesize関数は通常ファイルパスを引数に取りますが、このカスタム関数は画像バイナリデータをBase64エンコードし、data://ストリームラッパー形式のURIとしてgetimagesizeに渡すことで、文字列データからの画像情報取得を可能にしています。
getimagesize_from_string関数は、最初の引数$imageDataに画像のバイナリデータを文字列として受け取ります。例えば、file_get_contents()で読み込んだデータや、データベースから取得した画像データなどがこれに該当します。オプションの2番目の引数&$imageInfoには、getimagesize関数と同様に、IPTCやEXIFなどの詳細な画像情報を格納するための配列を渡すことができます。
処理が成功すると、画像の幅、高さ、種類、MIMEタイプ、HTMLタグ属性などの情報を含む配列が返されます。処理が失敗した場合はfalseが返されます。これは、渡されたデータが有効な画像データでない場合や、サポートされていない画像形式である場合に発生します。この関数を使うことで、一時的にファイルを保存することなく、メモリ上の画像データを効率的に扱うことができます。
getimagesize関数は、通常ファイルパスを扱いますが、data://ストリームラッパーを利用することで、メモリ上の画像バイナリデータからも情報を取得できる便利な機能です。この際、画像データはBase64エンコードされてURIに埋め込まれるため、大きな画像データを処理するとメモリ消費が増える点に注意が必要です。
最も重要なのは、関数が成功したかを確認するため、戻り値がfalseでないことをif ($result !== false)のように厳密にチェックすることです。これにより、画像データが破損していたり、サポートされていない形式であったりしても、プログラムが予期せぬエラーを起こすのを防げます。
getimagesizeが判別できる画像形式は、PHPのGD拡張機能に依存します。そのため、すべての画像形式に対応しているわけではないことを理解し、未知の形式や不正なデータに対しては、必ずエラーハンドリングを実装してください。
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 でSVG画像情報を取得する
1<?php 2 3/** 4 * 指定されたSVGファイルの画像情報を取得し、表示します。 5 * 6 * getimagesize() 関数は、画像ファイルのサイズやタイプを取得するために使用されます。 7 * SVGファイルの場合、この関数はファイルのXML属性(width, height)を解析してサイズを特定し、 8 * MIME タイプとして 'image/svg+xml' を返します。 9 * これは、通常のビットマップ画像(JPEG, PNGなど)とは異なる特性があるため、注意が必要です。 10 * 11 * @param string $filename 処理するSVGファイルのパス 12 * @return void 13 */ 14function displaySvgImageInfo(string $filename): void 15{ 16 echo "ファイル: '{$filename}' の画像情報取得を試行します。\n"; 17 18 // getimagesize関数を呼び出し、画像情報を取得します。 19 // 戻り値は配列、または取得に失敗した場合は false です。 20 // 第二引数 $image_info はオプションで、追加の画像メタデータを格納するために使われますが、 21 // ここではシンプルにするため省略しています。 22 $imageInfo = getimagesize($filename); 23 24 // 取得結果が false の場合、エラーとして処理します。 25 if ($imageInfo === false) { 26 echo " エラー: '{$filename}' の画像情報を取得できませんでした。\n"; 27 echo " ファイルが存在しないか、破損している可能性があります。\n"; 28 } else { 29 echo " --- 取得された画像情報 ---\n"; 30 // 配列の0番目と1番目の要素には、それぞれ画像の幅と高さが格納されます。 31 echo " 幅 (width): " . ($imageInfo[0] ?? 'N/A') . "px\n"; 32 echo " 高さ (height): " . ($imageInfo[1] ?? 'N/A') . "px\n"; 33 // 'mime'キーには、画像のMIMEタイプ(例: image/jpeg, image/png)が含まれます。 34 // SVGファイルの場合は 'image/svg+xml' となります。 35 echo " タイプ (MIME Type): " . ($imageInfo['mime'] ?? 'N/A') . "\n"; 36 37 // SVGファイル特有のMIMEタイプを確認し、その特性について補足します。 38 if (($imageInfo['mime'] ?? '') === 'image/svg+xml') { 39 echo " (補足: このファイルはSVG画像として認識されました。)\n"; 40 echo " getimagesizeは、SVGファイル内の<svg>タグのwidth/height属性からサイズを読み取ります。\n"; 41 } 42 43 echo " すべての詳細情報 (配列形式):\n"; 44 print_r($imageInfo); // 取得された全ての情報を表示します。 45 } 46 echo "\n"; // 出力の見やすさのために改行を追加 47} 48 49// === メイン処理 === 50// このセクションは、displaySvgImageInfo 関数を実際に呼び出すためのものです。 51 52// 1. サンプル用のSVGファイルを一時的に作成します。 53// これにより、getimagesizeが実際に動作するファイルを用意できます。 54$svgFilename = 'sample_image_for_getimagesize_test.svg'; 55$svgContent = <<<SVG 56<svg width="200" height="100" viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg"> 57 <rect x="0" y="0" width="200" height="100" fill="#e0e0e0" /> 58 <circle cx="100" cy="50" r="40" fill="green" /> 59</svg> 60SVG; 61 62// ファイルの書き込みに失敗する可能性も考慮し、エラーハンドリングを行います。 63if (file_put_contents($svgFilename, $svgContent) === false) { 64 echo "エラー: SVGファイル '{$svgFilename}' の作成に失敗しました。\n"; 65 exit(1); // 処理を終了 66} 67 68echo "一時SVGファイルを作成しました: '{$svgFilename}'\n\n"; 69 70// 2. 作成したSVGファイルの情報を取得し、表示します。 71displaySvgImageInfo($svgFilename); 72 73// 3. 存在しないファイルの情報を取得しようとした場合の例です。 74// この場合、getimagesizeは false を返し、エラーメッセージが表示されます。 75echo "--- 存在しないファイルに対する試行例 ---\n"; 76displaySvgImageInfo('non_existent_image_test.svg'); 77 78// 4. スクリプトの実行後、作成した一時ファイルを削除します。 79// これにより、不要なファイルがシステムに残らないようにします。 80if (file_exists($svgFilename)) { 81 unlink($svgFilename); 82 echo "一時SVGファイル '{$svgFilename}' を削除しました。\n"; 83} 84 85?>
PHP 8のgetimagesize関数は、指定された画像ファイルの幅、高さ、MIMEタイプといった詳細な情報を取得するために使用されます。引数$filenameには、情報を取得したい画像ファイルのパスを文字列で指定します。この関数は、ファイルの解析に成功した場合、画像の寸法や種類を示す情報を格納した配列を戻り値として返し、ファイルが見つからない、または破損しているなど、情報取得に失敗した場合はfalseを返します。
サンプルコードでは、一時的なSVG(Scalable Vector Graphics)ファイルをプログラムで作成し、そのファイルに対してgetimagesize関数を適用しています。SVGファイルの場合、この関数はSVGデータの<svg>タグ内に記述されたwidthやheight属性を解析してサイズを特定し、MIMEタイプとしては'image/svg+xml'を返します。取得された情報からは、画像の幅や高さ、ファイルの種類などが確認できます。関数がfalseを返した場合には、ファイルが存在しない、または無効なファイルである可能性を考慮し、適切にエラー処理を行うことが重要です。この関数は、アップロードされた画像のバリデーションや、画像ファイルを動的に処理する場面で広く活用されます。
getimagesize関数は、画像ファイルの情報を取得しますが、ファイルが存在しないか破損している場合はfalseを返します。そのため、戻り値がfalseでないかをif ($imageInfo === false)のように厳密に確認することが非常に重要です。特にSVGファイルでは、ビットマップ画像と異なり、<svg>タグのwidthやheight属性からサイズを読み取ります。MIMEタイプがimage/svg+xmlとなる点にも注意が必要です。また、サンプルコードにある一時ファイルの作成や削除のようなファイル操作は、権限不足などで失敗する可能性がありますので、各関数の戻り値を確認し、エラーハンドリングを行うようにしてください。正しいファイルパスを指定することも、関数を安全に利用するための基本です。
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が有効になっている必要があります。また、ネットワークの問題に備えてタイムアウトを設定しておくと、より安定したプログラムになります。