PHPで画像を動的に生成する【GD編】
こんにちは、sagaraです。秋ですね。週末は関西の母校に寄る予定なのですが、
男子校だったのが共学になっていたりと色々と様変わりしているようで、時代の変遷を感じそうです。
PHPで画像を扱う(GD拡張モジュール)
WEBで画像を生成するなら、HTML5のcanvasでしょうか…?
PHPでも画像を生成することができます。ボタンの背景画像にテキストを入れたり、
不正コピー防止のために透かしを入れたりといった使われ方があるようですね。
今回は、PHPで画像を生成する方法について書いていこうと思います。
画像関係の拡張モジュールには、以下のようなものがあります。
今回取り上げるのはGD拡張モジュールです。
PHP4.3以降では、GD拡張モジュール(バージョン2.x)は標準でPHPに同梱されているので、
インストールされていれば使うことができます。
インストールされているかどうかは、phpinfo()
のgdの項目 や print_r(gd_info());
などして
GD拡張モジュールに関する情報が見られるかどうかで確認できます。
デフォルトではGIF,PNG,JPEGがサポートされています(GDバージョン2.x)。
<img src = "○○○.php"> …??
<img src="image.php">
ちょっと見慣れない感じではあるのですが、img要素のsrc属性にphpを指定できるんですね。
image.phpの中には画像リソースを出力するようなコードを書きます。
これでimage.phpで処理した画像を表示することができます。
<img src="image.php?width=400&height=300&text=HELLO">
$_GET['width']で取得するなどして、パラメータで画像をリサイズしたり
テキストを挿入したりもできます。
画像を生成するためのコード
//新しく画像リソースを生成する場合
$img = imagecreate($width, $height);
//既存の画像リソースを読み込む場合
$gif = imagecreatefromgif($url);
$png = imagecreatefrompng($url);
$jpeg = imagecreatefromjpeg($url);
/**
* 画像処理する!!
*/
//出力する画像の種類のヘッダ情報をつける(以下はPNGの場合)
header('Content-Type: image/png');
//画像をPNG形式のデータとして出力
imagepng($img);
GDが生成する画像の種類には、パレット形式の画像とフルカラー画像の2種類があります。
imagecreate()
はパレット形式の画像リソースを生成する関数で、
256色までの色データを持つことができます。
フルカラー画像を扱う場合は、imagecreatetruecolor()
を使います。
こちらは各ピクセルに対してRGBの情報を持ち、色数の制限はありません。
また、アルファ値を設定して半透明な色を扱うことができます。
例えば…(image.php)
ランダムな背景色の画像を表示
//300x300の画像リソースを生成する
$img = imagecreate(300, 300);
$r = function () {
return rand(0, 255);
}
//色を指定(背景色となる)
$col = imagecolorallocate($im, $r(), $r(), $r());
header('Content-Type: image/png');
imagepng($img);
パレット形式の画像は、imagecolorallocate()
関数で最初に指定した色が、
その画像の背景色になります。
(9/19追記: 乱数を発生させる際に、$r = create_function(...)
と記述していましたが、
この関数はPHP7.2.0で非推奨となっているため、無名関数を用いたものに修正いたしました。)
既存の画像の右下に現在時刻を追加する
//既存の画像リソースを読み込む(PNGの場合)
$img = imagecreatefrompng('http://c-brains.jp/xxxxx.png');
$white = imagecolorallocate($im, 255, 255, 255);
//画像サイズを取得する
$sx = imagesx($img);
$sy = imagesy($img);
//文字を描画
imagestring($img, 10, $sx-180 , $sy-20, date('Y-m-d H:i:s'), $white);
header('Content-Type: image/png');
imagepng($img);
なお、imagestring()
は日本語の描画に対応していません。
日本語を使いたい場合は、imagettftext()
を使う方法がありますが、
TrueTypeフォント(.ttfファイル)を指定する必要があります。
矩形や円弧、直線の描画、画像の回転や拡大縮小のほか、他にも様々な関数が用意されています。 リファレンスをご覧ください。