ざっくりGD - 画像処理の基本とサイズ変更


　GDを使うとPHPで画像処理が可能です。頻繁にコールするとかそういうのには向いてないと思いますが、動的な画像生成においては必須と言えるかもしれません。


##画像の読み込み
　画像ファイルの読み込みは`imagecreatefromXXX( filename )`系列の関数群を用いて行います。いずれも第一引数に画像ファイルへのパス(またはURL)を要求します。読み込みに成功した場合にはリソース型を、エラー時には`false`を返します。

- imagecreatefromjpeg( filename )
- imagecreatefrompng( filename )
- imagecreatefromgif( filename )

##新規に画像を作成する場合

　既存のファイルではなく,新規に画像を作成する場合は、`imagecreatetruecolor( width, height )`関数を用いる。

##処理に使用する色を定義する。

　処理に色を使用する場合、色情報も画像リソースの中に含めます。色情報の作成は次のようにして行います。

    //通常のRGBによる色作成
    $orange = imagecolorallocate($im, 220, 210, 60);
    //アルファ値を指定しての色作成
    $red    = imagecolorallocatealpha($image, 255, 0, 0, 75);

第一引数にはimagecreate系の関数で得られるリソースを指定します。２番目以降の引数は、0-255の整数値で指定する他に、0x00-0xFFの16進値で指定することも可能です。

##画像のサイズ取得
　単に画像のサイズを取得する場合は`imagesx`関数と`imagesy`関数をコールすればよい。これらの関数は引数に画像リソースを取り、int型でそれぞれ画像幅と高さを返す関数となっている。

　getimagesize関数を用いて画像のサイズを取得することも可能。コレは引数に画像リソースを取り、配列を返す関数で、返り値の添字0,1が画像サイズになっている。

##画像のサイズ変更
　画像のサイズ変更にはimagecopyresized関数を用います。返り値はTRUE/FALSE

###imagecopyresized関数の引数とその説明

<table class="table table-condensed table-striped">
	<tr>
		<th>arg</th>
		<th>name</th>
		<th>description</th>
	</tr>
	<tr>
		<td>1</td>
		<td>dst_image</td>
		<td>コピー先の画像リンクリソース。</td>
	</tr>
	<tr>
		<td>2</td>
		<td>src_image</td>
		<td>コピー元の画像リンクリソース。</td>
	</tr>
	<tr>
		<td>3</td>
		<td>dst_x</td>
		<td>コピー先の x 座標。</td>
	</tr>
	<tr>
		<td>4</td>
		<td>dst_y</td>
		<td>コピー先の y 座標。</td>
	</tr>
	<tr>
		<td>5</td>
		<td>src_x</td>
		<td>コピー元の x 座標。</td>
	</tr>
	<tr>
		<td>6</td>
		<td>src_y</td>
		<td>コピー元の y 座標。</td>
	</tr>
	<tr>
		<td>7</td>
		<td>dst_w</td>
		<td>コピー先の幅。</td>
	</tr>
	<tr>
		<td>8</td>
		<td>dst_h</td>
		<td>コピー先の高さ。</td>
	</tr>
	<tr>
		<td>9</td>
		<td>src_w</td>
		<td>コピー元の幅。</td>
	</tr>
	<tr>
		<td>10</td>
		<td>src_h</td>
		<td>コピー元の高さ。</td>
	</tr>
</table>

　なおimagecopyresampled関数を用いると、サイズ変更に再サンプリング処理を付与することが可能です。引数の内容などの使い方himagecopyresized関数と同じです。

##画像の出力
　画像の出力には`imageXXX`系の関数を利用します。引数はimagepngを例に次のような形になります。

###JPEG形式での出力
    imagejpeg( resource $image [, string $filename [, int $quality ]] )

- $image：出力するイメージのリソース
- $filename：出力先となるファイル名。この値を省略する、または明示的にnullを与えることにより、出力先をfileではなく標準出力に切り替えることができる。
- $quality：圧縮レベルを0-100の値で指定。デフォルトは75

###PNG形式での出力
    imagepng( resource $image [, string $filename [, int $quality [, int $filters ]]] )

- $image：出力するイメージのリソース
- $filename：出力先となるファイル名。この値を省略する、または明示的にnullを与えることにより、出力先をfileではなく標準出力に切り替えることができる。
- $quality：圧縮レベルを0-9の値で指定
- filters：PNGファイルの大きさを調整するビットマスクフィルタ。資料なし

###GIF形式での出力
    imagegif( resource $image [, string $filename ] )

- $image：出力するイメージのリソース
- $filename：出力先となるファイル名。この値を省略する、または明示的にnullを与えることにより、出力先をfileではなく標準出力に切り替えることができる。

###インターレースを設定する
　画像のインターレースを有効にする場合、`imageinterlace($im, true);`とする。第一引数は画像リソース。逆にインターレースを無効にする場合には第二引数に0をセットする(なお、0はデフォルト値)。この関数は、既にインターレースビットが設定されている場合に1を、それ以外の場合に0を返す。


##コードサンプル
　目的の画像から縦横ともに1/2のサイズに縮小した画像を生成する例

	<?php
	header('Content-Type: image/jpeg');
	
	// 目的の画像から幅、高さを取得し,半分の値を計算します。
	list($width, $height) = getimagesize("test.jpg");
	$new_width = $width * 0.5;
	$new_height = $height * 0.5;
	
	// 画像を読み込み再サンプリングして1/4に縮小します。
	$image_p = imagecreatetruecolor($new_width, $new_height);
	$image = imagecreatefromjpeg("test.jpg");
	imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
	
	// 出力
	imagejpeg($image_p, null, 100);
	?>