[PHP]マスク画像で写真を好きな形に切り抜く(クリッピングマスク)

Pocket

result

写真と図形などのマスク画像を組み合わせて写真を自由な形にくり抜くサンプルです。
例ではアルファベットの「A」の形の透過 PNG に合わせて森の写真をはめ込み合成しています。
合成する写真よりもマスク画像が大きくならないように気をつけて下さい。

mask.png
mask

sample.jpg
sample

<?php
$canvas	 = new stdClass();
$image	 = new stdClass();
$mask	 = new stdClass();

$image->image	 = imagecreatefromjpeg('sample.jpg');
$mask->image	 = imagecreatefrompng('mask.png');

$image->width	 = imagesx($image->image);
$image->height	 = imagesy($image->image);

$mask->width	 = imagesx($mask->image);
$mask->height	 = imagesy($mask->image);

$canvas->width	 = $mask->width;
$canvas->height	 = $mask->height;
$canvas->image = imagecreatetruecolor($canvas->width, $canvas->height);

imagealphablending($canvas->image, false);
imagesavealpha($canvas->image, true);
$transparent = imagecolorallocatealpha( $canvas->image, 0, 0, 0, 127 );
imagefill( $canvas->image, 0, 0, $transparent );

//中心から切り抜くための調整
$top	 = round(($image->width - $mask->width) / 2);
$left	 = round(($image->height - $mask->height) / 2);

for($y=0;$y<$canvas->height;$y++){
	for($x=0;$x<$canvas->width;$x++){
		$rgb	 = imagecolorat($mask->image, $x, $y);
		$index	 = imagecolorsforindex($mask->image, $rgb);
		
		$alpha	 = $index['alpha'];
		//$alpha	 = ($index['red'] + $index['green'] + $index['blue']) / 765 * 127 ;

		$current = imagecolorat($image->image, $x + $top, $y + $left);
		$index	 = imagecolorsforindex($image->image, $current);
		$color	 = imagecolorallocatealpha($canvas->image, $index['red'], $index['green'], $index['blue'], $alpha);
		imagesetpixel($canvas->image, $x, $y, $color);
	}
}
header("Content-type: image/png");
imagepng($canvas->image);

imagedestroy($canvas->image);
imagedestroy($image->image);
imagedestroy($mask->image);

今回画像データの管理に stdClass() を用いましたが、PHP のバージョンが古い場合は連想配列を使って書きなおして下さい。
マスクの透明部分をもとに画像を切り抜くので、透明度を徐々に変化させてグラデーション状にすると切り抜かれる画像にもグラデーションがかかります。

・透明度のグラデーションを利用したマスク
gradient

grad_result

例では透過 PNG の不透明な部分に写真を合成していますが、色の黒い部分に画像を合成する場合は下記のように変更します。

//PNGの透明度を利用する方法
//$alpha	 = $index['alpha'];

//色の黒さを利用する方法
$alpha	 = ($index['red'] + $index['green'] + $index['blue']) / 765 * 127 ;

最初のサンプルでは文字の形に背景を切り出しましたが、逆に背景から文字部分を透明にするには、「$alpha = 127 – $alpha;」を付け足して反転させます。

$alpha	 = $index['alpha'];
$alpha   = 127 - $alpha;

result2


写真素材 足成
http://www.ashinari.com/


Similar Posts:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です