Home > PHP

画像の合成 (imagemagick)

 ある元の画像にある小さな画像を重ねて表示、つまり合成して表示する場合は以下のようなスクリプトになろうかと思います。ここでは普通の写真にsamleという文字を乗せます。
phpでImageMagickを使用する際にはオブジェクト指向みたいな感じで...ってオブジェクトそのものなんですが、いつものphpとはちょっと様子が違った文法で作成します。

imagick.php.jpeg 最初に合成に使用する画像を2枚用意します。単純に画像の上に画像を乗っけるだけなので、乗せる画像は下になる画像より小さい方がいいかと思います。
次にimagick(どうしてimagemagickではないんだか...。)をオブジェクトとして呼び出します。newでもってオブジェクトの作成とかなんとかいいます。
オブジェクト指向という考え方はいわゆるファンクションやサブルーチンのもうちょっと複雑なもの(いえ、逆に単純なもの)として考えれば合点いきます。いろいろなコマンドみたいなものを既にたくさん装備しているのでそれらを呼び出して使うという具合なわけです。そんなわけでサムネイルなんかも結構簡単に、しかもきれいに作ることができます。サムネイル画像を作る際には、コメントを外してください。幅が300の小さな画像を出力します。
<?
$photo = 'flower.jpg'; //元になる画像(大きい画像)
$over = 'sample.gif';  //合成する画像(画像に乗せる画像)

$image = new Imagick($photo);
$image_over = new Imagick($over);

//出力画像の大きさを指定したい場合(サムネイルとして小さく表示するとか)
#$image->thumbnailImage(300, null);//元の画像
#$image_over->thumbnailImage(200, null);//sample文字

//下地の画像作成
$canvas = new Imagick();

//キャンバスはどちらの画像よりも大きく
//下地の画像の大きさを調整
$width = $image->getImageWidth();
$height = $image->getImageHeight();

$canvas->newImage($width, $height, new ImagickPixel("black"));
$canvas->setImageFormat("jpg");

//合成
//数値はx,y posを表す
$canvas->compositeImage($image, imagick::COMPOSITE_OVER, 0, 0);
$canvas->compositeImage($image_over, imagick::COMPOSITE_OVER, ($width/2), ($height/2));//Sample文字の位置

//出力
header("Content-Type: image/jpeg");
print $canvas;
?>