GD でマスク処理

ふと、ImageLayerEffect() という関数を見付けたのですが、情報がなかったため、使い方を書いておきます。
 
User Contributed Notes より..

bool imagelayereffect ( resource image, int effect )
 
この関数は全ての描画関数の処理に影響を与えるという点で、既存の関数 ImageAlphaBlending() と似ています。(以下に示す)エフェクトモードを切替えることで既存の関数の機能を拡張できます。
 
effect には以下のうちいずれか一つを指定します。
 
IMG_EFFECT_REPLACE
ピクセル置換を利用します(ImageAlphaBlending(FALSE) と同等)
 
IMG_EFFECT_NORMAL
通常のピクセルブレンディングを利用します(ImageAlphaBlending(TRUE) と同等)
 
IMG_EFFECT_OVERLAY
 オーバーレイルーチンを利用します。オーバーレイは、黒い下地のピクセルは黒のまま、白い下地のピクセルは白のままですが、グレーの下地のピクセルに対しては上に乗るピクセルの色をとります。

 
当然気になるのは、IMG_EFFECT_OVERLAY です。
説明にある下地のピクセル(background pixels)というのは、たとえば imagecopy() を使う時の、コピー先の画像のそれぞれのピクセル、上に乗るピクセル(foreground pixels)というのはコピー元の画像のそれそれのピクセルにあたります。
 
下地がグレー(0x7F7F7F)の時は上に乗る色、
RGB のそれぞれが 0 に近付くほど、上に乗る色のそれぞれの色を暗くし、0になると元の色によらず 0 になります。つまり全てが0になると真黒(0x000000)になります。
同様に FF に近付くほど、元の色が明るくなり全てが FF になると真っ白(0xFFFFFF)になるようです。
 
例: 画像の任意の部分を黒に塗りつぶす

$im = imagecreatefromjpeg(“sample.jpg”); // 任意の元画像
// 画像サイズ
$w = imagesx($im);
$h = imagesy($im);
// 非透過
$c_visible = 0x007F7F7F;
// 背景(黒)
$c_bg = 0x00000000;
// 中央に円のあるマスクを作成
$im_mask = imagecreatetruecolor($w,$h);
imageFilledRectangle($im_mask, 0,0, $w,$h, $c_bg);
imageFilledEllipse ($im_mask, $w/2,$h/2, $w,$h, $c_visible);
 
// コピー先のエフェクトモードを変更(デフォルトは IMG_EFFECT_NORMAL)
imagelayereffect($im_mask, IMG_EFFECT_OVERLAY);
 
// 元画像にマスクを適用(結果はマスクに上書き)
imagecopy($im_mask, $im, 0,0, 0,0, $w,$h);
imagedestroy($im);
 
// マスク結果を出力
imagepng($im_mask);
imagedestroy($im_mask);

 
非透過とある部分を、 たとえば 0x00FF007F にすると、非透過部分のそれぞれのピクセルに対し、R 要素を FF, G 要素を 0, B 要素をそのままで出力します。
 
また、α値も組合せることが可能です。
 
例:画像の任意の部分を透過する

$im = imagecreatefromjpeg(“sample.jpg”); // 任意の元画像
// 画像サイズ
$w = imagesx($im);
$h = imagesy($im);
// 非透過
$c_visible = 0x007F7F7F;
// 背景(透過)
$c_bg = 0x7F7F7F7F;
// 中央に円のあるマスクを作成
$im_mask = imagecreatetruecolor($w,$h);
imagelayereffect($im_mask, IMG_EFFECT_REPLACE); // 透過色塗りのため上書きモードに変更。
imageFilledRectangle($im_mask, 0,0, $w,$h, $c_bg);
imageFilledEllipse ($im_mask, $w/2,$h/2, $w,$h, $c_visible);
imagelayereffect($im_mask, IMG_EFFECT_NORMAL); // 透過色を透過するため通常モードに戻す。
 
// コピー先のエフェクトモードを変更(デフォルトは IMG_EFFECT_NORMAL)
imagelayereffect($im_mask, IMG_EFFECT_OVERLAY);
 
// 元画像にマスクを適用(結果はマスクに上書き)
imagecopy($im_mask, $im, 0,0, 0,0, $w,$h);
// 透過色を保存する設定
imagesavealpha($im_mask, true);
 
imagepng($im_mask);
imagedestroy($im);