PHPマニュアル

画像を取り込む

画像ファイル名から取り込みを行い、画像IDを取得する。
画像IDはハンドラ的なもので各種画像処理で必要とされる。
	$img = imagecreatefrompng("imori.png");
	var_dump($img);
	imagedestroy($img); // 破棄
	

出力
	resource(3, gd)
	

検証

取り込んだ画像からサイズを取得する

	$img = imagecreatefrompng("imori.png");
	$sx = imagesx($img); // → 320
	$sy = imagesy($img);// → 180
	imagedestroy($img);
	


別名で保存する

	$img = imagecreatefrompng("imori.png");
	
	// 楕円を描画
	$col_ellipse = imagecolorallocate($img, 255, 255, 255);
	imageellipse($img, 200, 150, 300, 200, $col_ellipse);
	
	// 別名で保存
	imagepng( $img, "imori2.png");
	imagedestroy($img);
	


空画像を作成してファイル保存する

	// 空の画像を作成する
	$img = imagecreatetruecolor(200, 160);
	
	// 楕円の色を選択しますRGB
	$col = imagecolorallocate($img, 44,168,108);
	imageellipse($img, 50, 50, 60, 60, $col);
	
	// 画像を出力します
	imagepng( $img, "sec1-4.png");
	
	imagedestroy($img);
	


アルファチャネルによる透明

元画像:toumei.png:背景透明


元画像を取り込み、赤い円を描画し、透明を保ったまま保存する。
	$img = imagecreatefrompng("toumei.png");
	
	//ブレンドモードを無効にする
	imagealphablending($img, false);
	
	//完全なアルファチャネル情報を保存するフラグをonにする
	imagesavealpha($img, true);
	
	// 楕円を描画RGB
	$col = imagecolorallocate($img, 221,77,64);
	imageellipse($img, 50, 50, 60, 60, $col);
	
	// 別名で保存
	imagepng( $img, "toumei2.png");
	imagedestroy($img);
	

画像:toumei2.png



複数の画像を合成し、一枚の画像を作成する

合成する4枚の画像

4枚の画像を合成して一枚の画像ファイルを作成する。透明、半透明を透過させながら合成する。
		// 空の画像を作成する
		$img = imagecreatetruecolor(320, 240);
		
		// 背景を透明にする
		imagecolortransparent($img, imagecolorallocate($img, 0, 0, 0));
		
		// 画像ファイル名群
		$imgFns = array('toumei1.png','toumei2.png','toumei3.png','toumei4.png');
	
		// シンプルな画像合成
		foreach($imgFns as $fn){
	 		$img2 = imagecreatefrompng($fn); // 合成する画像を取り込む
	
	 		// 合成する画像のサイズを取得
			$sx = imagesx($img2);
			$sy = imagesy($img2);
			
			imageLayerEffect($img, IMG_EFFECT_ALPHABLEND);// 合成する際、透過を考慮する
			imagecopy($img, $img2, 0, 0, 0, 0, $sx, $sy); // 合成する
			
			imagedestroy($img2); // 破棄
		}
		
		// 別名で保存
		imagepng( $img, "combine.png");
		imagedestroy($img);
	

画像:combine.png



画像に別画像を拡大縮小しながらコピーする | imagecopyresampled

imagecopyでは拡縮しながら別画像をコピーすることができない。
拡縮したい場合は、代わりにimagecopyresampled関数を用いる。

	imagecopyresampled($img, $img2, コピー位置X, コピー位置Y,0, 0,拡縮サイズX, 拡縮サイズY,コピー元サイズX,コピー元サイズY);

引数説明
$imgコピー先、またはベース画像の画像リソースID。
$img2コピー元、つまり別画像の画像リソースID。
コピー位置X, コピー位置Yコピー先でのコピー元画像の位置。
0,0コピー元画像上における座標を示す。基本的に0でよい。
拡縮サイズX,拡縮サイズY拡大または縮小したときの画像幅を指定する。
コピー元サイズX,コピー元サイズYコピー元画像の幅。

画像に文字を重ねる | imagettftext

文字フォントのモジュールを文字情報技術促進協議会などから入手可能。 文字フォントのモジュールはipaexm.ttfなどttfファイルという形になっている。モジュールの配置先ディレクトリは適当な場所で良い。

サンプルコード


	<?php 
	
	$back_img_fp = "imori.jpg"; // 背景画像ファイルパス
	$res_img_fp = "test.png"; // 合成結果画像ファイルパス
	$text = "Hello!¥nシリケンイモリ¥n" . time(); // 重ねて合成表示する文字列
	$size = 32; // 文字列のサイズ
	$angle = 0; // 文字列の角度
	// 挿入位置
	$x = 8;         // 文字列の位置:左上座標
	$y = 8 + $size; // 文字列の位置:左上座標
	
	$image = imagecreatefromjpeg($back_img_fp);// 画像リソース IDを取得(失敗時はfalse)
	if(empty($image)){
		echo '画像取得に失敗しました。' . $back_img_fp . '<br>';
		die();
	}
	
	
	$color = imagecolorallocate($image, 255, 255, 255); // 文字列の色(int型:色ID)
	
	$fontfile = "ipaexm.ttf"; // 文字列フォントの指定
	
	// Windows環境用の文字列フォント設定
	if(PHP_OS == 'WINNT' ){
		$fontfile = "C:¥Windows¥Fonts¥meiryo.ttc";
	}
	
	imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text); // 文字列を画像に重ねて合成
	
	imagepng($image, $res_img_fp); // png形式で画像を出力
	
	?>
	<img src="<?php echo $res_img_fp; ?>?t=<?php echo time(); ?>" /><br>
	

出力画像




塗りつぶし | imagefill


<?php 

$img = imagecreatetruecolor(240, 160);
$color = imagecolorallocate($img, 250, 50, 50); // 塗りつぶし色
imagefill ($img ,0 , 0 ,  $color );

// 画像を出力します
imagepng( $img, "test.png");
imagedestroy($img);
$t = time();
echo "<img src='test.png?t={$t}' />";
?>
	

出力画像


文字列画像の横幅と縦幅 | imagettfbbox


<?php 

$back_img_fp = "imori.jpg"; // 背景画像ファイルパス
$size = 32; // 文字列のサイズ
$angle = 0; // 文字列の角度
$text = "シリケンイモリ"; // 重ねて合成表示する文字列

$fontfile = "ipaexm.ttf"; // 文字列フォントの指定

// Windows環境用の文字列フォント設定
if(PHP_OS == 'WINNT' ){
	$fontfile = "C:¥Windows¥Fonts¥meiryo.ttc";
}

$image = imagecreatefromjpeg($back_img_fp);// 画像リソース IDを取得(失敗時はfalse)
$info = imagettfbbox ( $size, $angle, $fontfile, $text );

echo "<table class='table'>";
foreach($info as $i => $v){
	echo "<tr><td>{$i}</td><td>{$v}</td></tr>";
}
echo '</table>';

$color = imagecolorallocate($image, 255, 255, 255); // 文字列の色(int型:色ID)

// 挿入位置
$x = 8;         // 文字列の位置:左上座標
$y = 8 + $size; // 文字列の位置:左上座標



imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text); // 文字列を画像に重ねて合成

imagepng($image, 'test.png'); // png形式で画像を出力

?>
<img src="test.png?t=<?php echo time(); ?>" /><br>
	
インデックス説明
03左下X
12左下Y
2294右下X
32右下Y
4294右上X
5-35右上Y
63左上X
7-35左上Y