PHP GDを使用した画像処理のまとめ

PHPのグラフィックライブラリ

はじめに

PHPで画像を処理する方法とサンプルコードを紹介します。
画像処理する場合は、通常なんらかのライブラリを使用する必要があります。

ライブラリによって、特長や使用方法が多少異なってきます。
そのため使用する内容によって適切なものを選びましょう。
PHPでは以下のグラフィックライブラリがあります。

Cairo
Exif
GD
Gmagick
ImageMagick

この中でも良く使われているのが、GDとImageMagickです。
これらは画像のリサイズや結合、切り取りなどを行うのに便利です。
今回はこのGDライブラリの使用方法について紹介します。
おそらくPHPの画像処理では一番使われているものだと思います。

GDについて

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);
Related

Vagrant+Docker+PHP環境で「session.save_path」指定時に、セッションファイルが空になるエラー

ファイル共有でのフォルダの所有者を設定 結論 PHP5.4.28 からセッションファイルのownerはrootもしくはWebサーバのユーザに限るという制限が...

LINEと連携したテイクアウト事前注文システム徹底比較!

目次 テイクアウト予約・注文受付システムのトレンド LINEと連携したテイクアウト事前注文システムの価格表 L.B.B.Cloud テイクイーツ ...

PHPで動画の撮影日を取得

PHPで動画の撮影日を取得 概要 PHPからffprobeコマンドを実行し、動画の撮影日時を取得します。 コード $posted_at = ...

FullCalendarでGoogleカレンダーのようなUIを実装

jQueryプラグインFullCalendarのサンプル 概要 FullCalendarを使用して、GoogleカレンダーのようなUIを実装する使用例を...

PHP Laravel5.2でmulti-auth(複数テーブルでの認証)を実装

Laravel5.2でマルチ認証 概要 LaravelとはPHPの中で今最も伸びているフレームワークです。 処理速度が遅いなどありますが、かなり使い安く拡...

PHP 正規表現でIPアドレス形式の文字列か判定

正規表現でIPアドレスの入力チェック 概要 フォームで入力されたIPアドレスが正当な文字列か判定するためのバリデーション処理を実装します。 基本的...
トップへ戻る