PHP5技術者認定試験上級のためにPHPで動的に画像を生成する方法を勉強しているのですが、
「この技術まだ使うのだろうか」という思いがありグラフィックスの章の勉強が非常に億劫になっています。
グラフィックスの出題割合は0.04と少ないですが、この章を捨てる勇気もないので頭の整理ついでにアウトプットとして残しておきます。
グラフィック基本概念
PHPで画像を生成する云々の前に、グラフィックについての最低限の理解をしておく必要があります。
ピクセル
画像はさまざまな色のピクセル(四角)の集まりです。
Photoshopなどの画像編集ツールを使ったことがある人であれば一度は画像を切り抜きしたことがあるかと思います。
その時に画像をズームすると細かい小さな四角が見えるのですが、それがピクセルの正体です。
このピクセルが多ければ多いほど画像は滑らかで非常に鮮明に見えますが、反対にピクセルが少なければ粗い画像になります。
ファイルフォーマット
画像ファイルは単にピクセルを並べただけではなくファイルフォーマットに従ってデータを圧縮します。
代表的なものでいうと、PNG、JPEG、GIFがあります。
それぞれフォーマットには特徴があるので簡単にまとめておきます。
GIF
- 可逆圧縮
- 透過処理ができる
- データ容量が小さい
- アニメーションが作れる
- 表現できる色が256色
PNG
- 可逆圧縮
- 透過処理ができる
JPEG
- 非可逆圧縮
- フルカラー1670万色まで扱える
アンチエイリアス
コンピュータの画面上は写真のように細かい四角がズラーっと並べられていて、その細かい四角に色をつけることで文字や線を表現しています。
文字や線をズームしてみると角がギザギザしているのが分かるかと思います。
これをエイリアスといいます。
このギザギザを目立たなくする工夫がアンチエイリアスです。
画像を描画する
PHPで画像を描画するにはまず、「既存の画像読み込む」か「新規に画像を作成する」のどちらかを実行しなければなりません。
既存の画像読み込む
まずは、加工したい画像をPHPのスクリプトに読み込む必要があります。
その時に利用するのがimagecreatefrompng関数です。
この関数はPNGの画像を読み込む時に利用します。
他にもJPEGやGIFを読み込むときはフォーマットに応じたimagecreatefromjpeg関数、imagecreatefromgif関数を呼び出す必要があります。
これらの関数の返り値はGDImageのインスタンスになります。
画像を加工する場合はこのインスタンスを使い回すので必ず変数に代入しておいてください。
$image = imagecreatefrompng("画像までのパス");
新規に画像を作成する
PHPで画像を作成するにはimagecreate関数かimagecreatetruecolor関数のどちらかを使用します。
パレットを使用する画像を作成するときはimagecreate関数、トゥルーカラーの画像を作成するときはimagecreatetruecolor関数を使用します。
どちらの関数も引数には画像の幅と高さを渡す必要があります。
これらの関数はGDimageのインスタンスを返すので、imagecreatefrompng関数の時と同様に変数に入れて使い回せるようにしておきます。
$image = imagecreate(200, 200);
画像で使用する色を決める
画像で使用する色を決めるにはimagecolorallocate関数を使用します。
引数に取る値は以下の通りです。
imagecolorallocate(GDImageインスタンス, 0~255, 0~255, 0~255);
第二引数から第四引数までの値は16進数でも指定できます。
Red、Green、Blueの順に値を設定します。
この関数は色のIDを返します。
生成したいろを使い回したい場合は変数に代入しておいてください。
また、この関数を最初に呼び出し指定した色がimagecreate関数またはimagecreatetruecolor関数の背景色になります。
2回呼び出しても1回目の色が背景色に指定されるので注意が必要です。
// width: 200px, height: 200pxの画像を作成
$image = createimage(200, 200);
// $imageの背景色を白色に設定
imagecolorallocate($image, 255, 255, 255);
// 赤色のIDを生成
imagecolorallocate($image, 255, 0, 0);
画像を出力する
これまでに登場した関数は描画する画像の元を作っていただけに過ぎません。
今度はちゃんと出力してWeb上で確認できるようにします。
画像を出力する工程は以下の2つに分けられます。
- レスポンスヘッダーでContent-Typeを設定する
- 出力する画像のフォーマット形式を決定し、出力する
この1, 2の順が逆転するだけで出力されないので注意が必要です。
Content-Typeはサーバーからクライアントに返されたコンテンツを示すのに利用されるレスポンスヘッダーです。
例えば、HTMLのContent-Typeはtext/htmlです。
PNGであればimage/png、JPEGであればimage/jpegになります。
Content-Typeがimage/pngのレスポンスを返すには以下の記述が必要です。
header("Content-Type: image/png");
画像を出力する処理はimagepng関数、imagegif関数、imagejpeg関数などを使用します。
出力したい画像フォーマット形式の関数を使用してください。
Content-Typeと出力する画像のフォーマットが一致していなくても問題なく描画できますが、一致させておくことがベターです。
これまでに紹介した関数を使用してWeb上に画像を出力する一連の処理は以下のようになります。
$image = imagecreate(200, 200);
imagecolorallocate($image, 255, 255, 255);
header("Content-Type: image/png");
imagepng($image);
ブラウザでこのように表示されていれば正常に動作しています。
まとめ
- PHPでWeb上に画像を表示するにはまず、「既存の画像を使用する」か「画像を新しく作る」のどちらかを選択する。
- 「既存の画像を使用する」場合、読み込む画像のフォーマットにあった関数を使用する。
例)imagecreatepng(“画像までのパス”); - 「画像を新しく作る」場合は、imagecreate関数かimagecreatetruecolor関数のどちらかを使用する。
- GDImageインスタンスに色を指定するにはimagecolorallocate関数を使用する。
最初に呼び出したimagecolorallocateの指定した色が背景色になる。 - 加工または作成した画像をWeb上に表示するには「Content-Typeを指定する」と「画像を出力する」の工程が必要。
この工程が逆転すると表示されなくなるので注意。 - header関数でContent-Typeに出力する画像のフォーマットを記述する。
例)header(“Content-Type: image/png”); - 出力したい画像のフォーマットに合わせて出力関数を呼び出す。
例)imagepng(GDImageインスタンス);
試験まで残り2週間ですが試験範囲が全然終わりません。。。