PHPでグラフィック処理をするGDライブラリは、256色の画像だけでなく、アルファチャネル付きのフルカラー画像を扱うことができます。
今までに登場したimagecreate関数が256色の画像、imagecreatetruecolor関数がアルファチャネル付きのフルカラー画像を作成できるという風に覚えておいて問題ないかと思います。
使い分けが大変なので基本的にはimagecreatetruecolor関数を使用しておけば大丈夫です。
imagecolorallocate関数を複数回呼び出すと最初に呼び出されたimagecolorallocate関数で指定した色が画像の背景色になっていましたが、imagecreatetruecolor関数で作成した画像には適用されないので注意が必要です。
作成した画像にimagefilledrectangle関数で作成した矩形を重ねて描画すると今まで通りのような見え方になります。
アルファブレンディング
そもそもアルファとはなんなのかというところなんですが、これは透過率です。
アルファブレンディングは透過した時に重なった下の色と上の色を混ぜるかどうかというものです。
imagecreatetruecolor関数で作成した画像は初めからアルファブレンディングがオンになっている状態です。
もし、アルファブレンディングをオフにしたい場合は、imagealphablending関数を使用します。
imagealphablending(GDImage, flag);
imagecreatetruecolor関数で作成した画像にアルファブレンディングを適用しない書き方はこのようになります。
$image = imagecreatetruecolor(200, 200);
imagealphablending($image, false);
透過処理
PHPで色の透過の設定を行うにはimagecolorallocatealpha関数を使用します。
imagecolorallocatealpha(GDImage, red, green, blue, alpha)
基本的な使い方はimagecolorallocate関数と同じですが、alphaという引数に0~127の値を渡してください。
0は完全に不透明、127は完全に透明になります。
青色の四角の上にalpha50の赤色の楕円を乗せるとこのようになります。
$image = imagecreatetruecolor(200, 200);
$blue = imagecolorallocate($image, 0, 0, 255);
imagefilledrectangle($image, 0, 0, 200, 200, $blue);
$red = imagecolorallocatealpha($image, 255, 0, 0, 50);
imagefilledellipse($image, 100, 100, 200, 100, $red);
header("Content-Type: image/png");
imagepng($image);
透過した楕円部分が青と重なって色が混ざっていますね。
今度はアルファブレンディングをオフにして実行するとどのようになるか確認してみましょう。
$image = imagecreatetruecolor(200, 200);
imagealphablending($image, false);
$blue = imagecolorallocate($image, 0, 0, 255);
imagefilledrectangle($image, 0, 0, 200, 200, $blue);
$red = imagecolorallocatealpha($image, 255, 0, 0, 50);
imagefilledellipse($image, 100, 100, 200, 100, $red);
header("Content-Type: image/png");
imagepng($image);
アルファブレンディングをオフにしているので透過した部分が背景と混ざった色になっていないですね。
imagealphablending関数を使用するとこのような違いが出てくるので押さえておきましょう。
色を特定する
画像内の特定の点の色を調べるにはimagecolorat関数とimagecolorsforindex関数を使用します。
imagecolorat(GDImage, x, y);
imagecolorsforindex(GDImage, color);
imagecolorat関数で指定した座標の色のインデックスを取得し、その値をimagecolorsforindex関数に渡すことでred、green、blue、aplphaのそれぞれの値を連想配列で取得できます。
$image = imagecreatetruecolor(200, 200);
$blue = imagecolorallocate($image, 0, 0, 255);
imagefilledrectangle($image, 0, 0, 200, 200, $blue);
$point = imagecolorat($image, 100, 100);
print_r(imagecolorsforindex($image, $point));
blueのバリューが255になっていれば指定した座標の色を取得できています。