第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.

既存の画像ファイルを読み込み、特定の位置にテキストを追加して新しい画像として保存するプログラムを作成してください。