PHPで画像に別の画像を重ねる方法

PHPで既存の画像に別の画像を重ねる方法です。

例えば左上の隅にロゴ画像を挿入したいと思ったときに使える方法です。

重ねて上になる画像(ロゴ画像の方)の背景は透明にしておいたほうがうまくいきます。

 

同じ作業を繰り返すことで複数の画像を重ねることも可能です。

大きな画像を定義して、そこに並べて結合することも可能です。

目次

PHPで画像に別の画像を重ねる方法

画像を重ねるときは、前回の記事「PHPで読み込んだ画像のサイズを変更する方法」で使った関数imagecopyresampled()を使います。

imagecopyresampled()は、サイズを変えながら画像を別の画像にコピーする関数でした。

これの座標を使えばできます。

サンプルの仕様

blue.jpgというただ青いだけの画像があります。

そこに、neko.jpg を配置します。

サイズは、blue.jpgの1/3で、左から10px、上から10pxの位置に配置します。

結果は、buleneko.jpg というファイル名で出力します。

画像を重ねるコード

$file1 = "blue.jpg";
$file2 = "neko.jpg";
$newfile = "buleneko.jpg";

// コピー先画像作成
$dst_image = imagecreatefromjpeg($file1);

// コピー先画像のサイズ取得
$imagesize = getimagesize($file1);
$dst_w = $imagesize[0];
$dst_h = $imagesize[1];


// コピー元画像読み込み
$src_image = imagecreatefromjpeg($file2);

// コピー元画像のサイズ取得
$imagesize = getimagesize($file2);
$src_w = $imagesize[0];
$src_h = $imagesize[1];

// コピー元画像の配置後のサイズ計算
$resize_w = $dst_w / 3;
$resize_h = $src_h / ($src_w / $resize_w);

// リサイズしてコピー
imagecopyresampled(
	$dst_image, // コピー先の画像
	$src_image, // コピー元の画像
	10,         // コピー先の x 座標
	10,         // コピー先の y 座標。
	0,          // コピー元の x 座標
	0,          // コピー元の y 座標
	$resize_w,  // コピー先の幅
	$resize_h,  // コピー先の高さ
	$src_w,     // コピー元の幅
	$src_h);    // コピー元の高さ

imagejpeg($dst_image, $newfile);

コード解説

まず、ベースになる blue.jpg と、コピー元の neko.jpg を読み込み、サイズも取得します。

画像ファイルの読み込みには imagecreatefromjpeg() を使います。

画像のサイズは、getimagesize() を使い取得し、結果の配列の0番目が横幅で1番目が高さになります。

 

neko.jpgのリサイズ後のサイズを、blue.jpgのサイズから計算します。

ベースになる blue.jpg の横幅の1/3を取得し、リサイズ後の横幅とします。

リサイズ後の横幅と、neko.jpgの横幅の比率を計算し、その比率からリサイズ後の高さを算出します。

 

「リサイズしてコピー」のimagecopyresampled()で実際に重ねた画像を作成します。

「コピー先の x 座標」は neko.jpg を配置する場所を左上を基点に右方向の隙間幅を指定します。単位はピクセルです。

「コピー先の y 座標」は neko.jpg を下方向の隙間幅を指定します。

「コピー先の幅」と「コピー先の高さ」に neko.jpg を配置するサイズを指定します。

 

最後に imagejpeg() でファイル名を付けて作成した画像をファイルに出力します。

まとめ

今回は画像を重ねる方法を紹介しました。

ベースになる画像は今回はただの青い画像ですが、これはファイルを読み込まなくてもGDで作成しても大丈夫です。

また、ベース画像を生成してそこに複数の画像を並べることも可能です。

この記事を書いた人

ライターのプロフィールが入ります。このライター情報を入れたくない場合は管理画面の ユーザー > あなたのプロフィールの「プロフィール情報」を未入力にすれば表示されません。逆に「プロフィール情報」を入力することでライター情報を表示できます。

コメント

コメントする

CAPTCHA


目次
閉じる