PHPで画像を処理する方法とサンプルコードを紹介します。
画像処理する場合は、通常なんらかのライブラリを使用する必要があります。
ライブラリによって、特長や使用方法が多少異なってきます。
そのため使用する内容によって適切なものを選びましょう。
PHPでは以下のグラフィックライブラリがあります。
Cairo
Exif
GD
Gmagick
ImageMagick
この中でも良く使われているのが、GDとImageMagickです。
これらは画像のリサイズや結合、切り取りなどを行うのに便利です。
今回はこのGDライブラリの使用方法について紹介します。
おそらくPHPの画像処理では一番使われているものだと思います。
GDライブラリを使用することで、JPEG,GIF,PNG などの画像を処理することができます。
画像の編集に特化しており、リサイズ、分割、結合、切抜きなどの処理を簡単に行えます。
GDは初めから入っていないことが多いので別途インストールする必要があります。
PHP4.3以降であれば簡単にいれることができますが、PHP4.3より古いバージョンを使っている場合、GD互換ライブラリがPHPに同梱されていないため少し面倒です。
GDライブラリを使用して画像のリサイズ処理を行います。
以下の例では、images/sample.jpgの画像をthum/sample.jpgにコピーしてリサイズを行っています。
横幅が190pxまたは縦幅が100pxとなるよう、縦横比を固定してリサイズします。
以下がPHPでリサイズを行うサンプルコードとなります。
$image = 'sample.jpg';
$w = 190;
$h = 100;
$image_path = "images/" . $image;
$thum_path = "thum/" . $image;
copy($image_path, $thum_path);
list($width, $height, $type) = getimagesize($thum_path);
switch ($type) {
case IMAGETYPE_GIF:
$img_ue = imagecreatefromgif($thum_path);
break;
case IMAGETYPE_JPEG:
$img_ue = imagecreatefromjpeg($thum_path);
break;
case IMAGETYPE_PNG:
$img_ue = imagecreatefrompng($thum_path);
break;
default:
return false;
}
$img_shita = imagecreatetruecolor($w,$h);
$white = imagecolorallocate($img_shita,255,255,255);
imagefilltoborder($img_shita, 0, 0, $white, $white);
$newwidth = $w;
$newheight = $h;
$x = 0;
$y = 0;
if($width == $w && $h == $height) {
return true;
}
if($width > $height * ($h / $w)) {
$newwidth = $width * ($h / $height);
$newheight = $h;
}else{
$newwidth = $w;
$newheight = $height * ($w / $width);
}
$result = true;
if(imagecopyresampled($img_shita, $img_ue, $x, $y, 0, 0, $newwidth, $newheight, $width, $height)){
switch ($type) {
case IMAGETYPE_GIF:
imagegif($img_shita, $thum_path);
break;
case IMAGETYPE_JPEG:
imagejpeg($img_shita, $thum_path);
break;
case IMAGETYPE_PNG:
imagepng($img_shita, $thum_path);
break;
default:
return false;
}
} else {
$result = false;
}
imagedestroy($img_ue);
imagedestroy($img_shita);
return $result;
GDライブラリを使用してPHPで画像を結合するには、imagecopyを使用します。
imagecopyでは、4つめの引数でy(コピー先のy座標)を指定します。
これを利用して、y座標を順にずらしていくことで複数の画像を結合します。
以下の例では、first.pngとsecond.phpを結合して、merged.pngを作成しています。
$w = 190;
$h = 200;
$dst_im = imagecreatetruecolor($w, $h);
$white = imagecolorallocate($dst_im, 0xFF, 0xFF, 0xFF);
imagefill($dst_im, 0, 0, $white);
list($width, $height, $type) = getimagesize('first.png');
switch ($type) {
case IMAGETYPE_GIF:
$src_im = imagecreatefromgif('first.png');
break;
case IMAGETYPE_JPEG:
$src_im = imagecreatefromjpeg('first.png');
break;
case IMAGETYPE_PNG:
$src_im = imagecreatefrompng('first.png');
break;
default:
return false;
}
imagecopy($dst_im, $src_im, 0, 0, 0, 0, 190, 100);
imagedestroy($src_im);
list($width, $height, $type) = getimagesize('second.png');
switch ($type) {
case IMAGETYPE_GIF:
$src_im = imagecreatefromgif('second.png');
break;
case IMAGETYPE_JPEG:
$src_im = imagecreatefromjpeg('second.png');
break;
case IMAGETYPE_PNG:
$src_im = imagecreatefrompng('second.png');
break;
default:
return false;
}
imagecopy($dst_im, $src_im, 0, 100, 0, 0, 190, 100);
imagedestroy($src_im);
$black = imagecolorallocate($dst_im, 0x00, 0x00, 0x00);
imagerectangle($dst_im, 0, 0, $w-1, $h-1, $black);
switch ($type) {
case IMAGETYPE_GIF:
imagegif($img_shita, 'merged.png');
break;
case IMAGETYPE_JPEG:
imagejpeg($img_shita, 'merged.png');
break;
case IMAGETYPE_PNG:
imagepng($img_shita, 'merged.png');
break;
default:
return false;
}
imagedestroy($dst_im);