第19章 グラフィックス
PHPでのグラフィックス処理
GDライブラリはPHPで最も一般的に使用される画像処理ライブラリです。このライブラリを使用すると、画像を作成、読み込み、操作することができます。JPEG、PNG、GIFなどのさまざまなフォーマットをサポートしています。
ここではいくつかサンプルのコードを紹介していきます。
画像の作成と操作
// 画像の幅と高さを指定
$width = 200;
$height = 100;
// 空の画像を作成
$image = imagecreatetruecolor($width, $height);
// 背景色を設定 (R, G, B)
$background_color = imagecolorallocate($image, 255, 255, 0);
imagefill($image, 0, 0, $background_color);
// 画像を出力
header('Content-Type: image/png');
imagepng($image);
// メモリを解放
imagedestroy($image);
生成された画像
画像の読み込みと加工
// 既存の画像を読み込み
$image = imagecreatefromjpeg('sample.jpg');
// サイズを取得
$original_width = imagesx($image);
$original_height = imagesy($image);
// 新しいサイズを設定
$new_width = 100;
$new_height = 50;
// 新しい画像を作成してリサイズ
$new_image = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $original_width, $original_height);
// 画像を出力
header('Content-Type: image/jpeg');
imagejpeg($new_image);
// メモリを解放
imagedestroy($image);
imagedestroy($new_image);
読み込んだ画像画像
生成された画像
線の描画
$image = imagecreatetruecolor(200, 200);
// 色を設定 (R, G, B)
$line_color = imagecolorallocate($image, 0, 0, 255);
// 線を描画 (始点x, 始点y, 終点x, 終点y)
imageline($image, 50, 50, 150, 150, $line_color);
// 画像を出力
header('Content-Type: image/png');
imagepng($image);
// メモリを解放
imagedestroy($image);
生成された画像
円の描画
$image = imagecreatetruecolor(200, 200);
// 色を設定 (R, G, B)
$circle_color = imagecolorallocate($image, 255, 0, 0);
// 円を描画 (中心x, 中心y, 幅, 高さ, 開始角度, 終了角度)
imagearc($image, 100, 100, 50, 50, 0, 360, $circle_color);
// 画像を出力
header('Content-Type: image/png');
imagepng($image);
// メモリを解放
imagedestroy($image);
生成された画像
テキストの描画
$image = imagecreatetruecolor(200, 100);
// 背景色を設定
$background_color = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $background_color);
// テキスト色を設定
$text_color = imagecolorallocate($image, 0, 0, 0);
// テキストを描画 (フォントサイズ, 角度, x座標, y座標, 色, フォントファイル, テキスト)
imagettftext($image, 20, 0, 10, 40, $text_color, 'arial.ttf', 'Hello, World!');
// 画像を出力
header('Content-Type: image/png');
imagepng($image);
// メモリを解放
imagedestroy($image);
生成された画像
画像の回転
$source = imagecreatefromjpeg('example.jpg');
$rotate = imagerotate($source, 45, 0); // 45度回転
header('Content-Type: image/jpeg');
imagejpeg($rotate);
imagedestroy($source);
imagedestroy($rotate);
読み込んだ画像画像
生成された画像
画像のグレースケール化
$source = imagecreatefromjpeg('example.jpg');
imagefilter($source, IMG_FILTER_GRAYSCALE);
header('Content-Type: image/jpeg');
imagejpeg($source);
imagedestroy($source);
読み込んだ画像画像
生成された画像
画像の一部切り取り
$source = imagecreatefromjpeg('example.jpg');
$cropped = imagecrop($source, ['x' => 50, 'y' => 50, 'width' => 100, 'height' => 100]);
header('Content-Type: image/jpeg');
imagejpeg($cropped);
imagedestroy($source);
imagedestroy($cropped);
読み込んだ画像画像
生成された画像
簡単な3D描画
$image = imagecreatetruecolor(400, 400);
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 0, 0, 400, 400, $white);
// 立方体の頂点
$vertices = [
[100, 100, 100],
[200, 100, 100],
[200, 200, 100],
[100, 200, 100],
[150, 150, 200],
[250, 150, 200],
[250, 250, 200],
[150, 250, 200],
];
// 立方体の辺を描画
for ($i = 0; $i < 4; $i++) {
$next = ($i + 1) % 4;
imageline($image, $vertices[$i][0], $vertices[$i][1], $vertices[$next][0], $vertices[$next][1], $black);
imageline($image, $vertices[$i + 4][0], $vertices[$i + 4][1], $vertices[$next + 4][0], $vertices[$next + 4][1], $black);
imageline($image, $vertices[$i][0], $vertices[$i][1], $vertices[$i + 4][0], $vertices[$i + 4][1], $black);
}
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
生成された画像
EXIF情報の抽出
EXIF(Exchangeable Image File Format)情報は、デジタルカメラで撮影された画像に埋め込まれるメタデータです。これには、撮影日時、カメラモデル、露出時間、F値、ISO速度、GPS情報など、画像の撮影に関連する多岐にわたる情報が含まれています。
PHPでは、exif_read_data関数を使用することで、画像ファイルからEXIF情報を読み取ることができます。
// 画像ファイルのパス
$imageFile = 'example.jpg';
// EXIF情報の抽出
$exifData = exif_read_data($imageFile, 'EXIF');
if ($exifData !== false) {
// 撮影日時
echo '撮影日時: ' . $exifData['DateTimeOriginal'] . "
";
// カメラモデル
echo 'カメラモデル: ' . $exifData['Model'] . "
";
// 露出時間
echo '露出時間: ' . $exifData['ExposureTime'] . "
";
// F値
echo 'F値: ' . $exifData['FNumber'] . "
";
// その他の情報を表示
// print_r($exifData);
} else {
echo 'EXIF情報が見つかりませんでした。';
}
このコードは、指定された画像ファイルからEXIF情報を読み取り、撮影日時、カメラモデル、露出時間、F値などの情報をブラウザに表示します。
exif_read_data関数で取得できる情報の一部
配列キー | 内容 |
---|---|
FileName | ファイル名 |
FileDateTime | ファイルの日時 |
FileSize | ファイルサイズ |
FileType | ファイルタイプ |
MimeType | MIMEタイプ |
COMPUTED | 計算された値のセクション。幅、高さなど |
Make | カメラ製造メーカー |
Model | カメラモデル |
Orientation | 画像の方向(回転・反転) |
XResolution, YResolution | 画像の解像度 |
ExposureTime | 露出時間 |
FNumber | F値(絞り値) |
ExposureProgram | 露出プログラム |
ISOSpeedRatings | ISO速度 |
DateTimeOriginal | オリジナルの撮影日時 |
ShutterSpeedValue | シャッタースピード |
ApertureValue | 開口値 |
BrightnessValue | 明るさ値 |
ExposureBiasValue | 露出補正値 |
MaxApertureValue | 最大開口値 |
MeteringMode | 測光モード |
Flash | フラッシュ情報 |
FocalLength | 焦点距離 |
UserComment | ユーザーコメント |
ColorSpace | 色空間情報 |
GPSLatitude, GPSLongitude, GPSAltitude | GPS情報(緯度、経度、高度) |
これらは取得できる情報の一部であり、カメラのメーカーやモデル、撮影設定などによって、他にもさまざまな情報が取得できる場合があります。全ての可能なEXIFタグを列挙するのは困難であり、具体的な情報が必要な場合は、関連するドキュメントや仕様書を参照するとよいでしょう。
SVGファイル
PHPでSVG(Scalable Vector Graphics)ファイルを扱うには、XML操作の基本的な手法を使用します。SVGはXMLベースのベクターグラフィック形式なので、PHPのDOMやSimpleXML拡張機能を利用してSVGファイルを操作することができます。
SVGファイルの作成
以下は、PHPで新しいSVGファイルを作成するサンプルコードです。
// DOMDocumentオブジェクトを作成
$dom = new DOMDocument('1.0', 'utf-8');
// SVG要素を追加
$svg = $dom->createElementNS('http://www.w3.org/2000/svg', 'svg');
$svg->setAttribute('width', '800');
$svg->setAttribute('height', '600');
$dom->appendChild($svg);
// 円要素を追加
$circle = $dom->createElementNS('http://www.w3.org/2000/svg', 'circle');
$circle->setAttribute('cx', '400');
$circle->setAttribute('cy', '300');
$circle->setAttribute('r', '100');
$circle->setAttribute('stroke', 'black');
$circle->setAttribute('stroke-width', '2');
$circle->setAttribute('fill', 'red');
$svg->appendChild($circle);
// SVGを出力
header('Content-Type: image/svg+xml');
echo $dom->saveXML();
既存のSVGファイルの読み込みと変更
既存のSVGファイルを読み込み、変更する例も以下のようにできます。
// SVGファイルを読み込む
$svgFile = 'example.svg';
$dom = new DOMDocument();
$dom->load($svgFile);
// SVG要素を取得
$svg = $dom->getElementsByTagName('svg')->item(0);
// 新しい矩形要素を作成
$rect = $dom->createElementNS('http://www.w3.org/2000/svg', 'rect');
$rect->setAttribute('x', '10');
$rect->setAttribute('y', '10');
$rect->setAttribute('width', '200');
$rect->setAttribute('height', '100');
$rect->setAttribute('fill', 'blue');
// 矩形をSVGに追加
$svg->appendChild($rect);
// 変更をファイルに保存
$dom->save($svgFile);
これらの例を通じて、PHPのDOM操作を使ってSVG要素の作成、属性の設定、子要素の追加などが行えることがわかります。
OpenCV
OpenCV(Open Source Computer Vision Library)は、コンピュータビジョンに関連するプログラミング機能を提供するオープンソースライブラリです。画像処理、顔認識、物体認識など、さまざまなビジョンアプリケーションに使用されています。
PHPでのOpenCV利用は一般的ではありませんが、OpenCVを使用するためのバインディングや拡張機能がいくつか存在します。具体的なインストールと設定は、使用するバインディングや環境に依存するため、公式ドキュメントや関連するガイドを参照することをお勧めします。
練習問題1.
指定された画像ファイル(例:JPEGまたはPNG)を読み込み、別のフォーマットで保存するプログラムを作成してください。
練習問題2.
新しい画像を作成し、その上に色々な図形(円、四角形、線など)を描画して表示するプログラムを作成してください。
練習問題3.
既存の画像ファイルを読み込み、特定の位置にテキストを追加して新しい画像として保存するプログラムを作成してください。