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

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

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

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

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

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

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

rbenv環境でRuby on Railsのアプリケーションを一瞬で自動生成

アプリケーション構築時に最初に行う手順 概要 アプリケーションを作成するまでの手順を記載しています。 rbenvなどの環境が設定済と仮定して話を進めま...

Rails devise・authority・rolifyで権限付きの認証機能

devise・authority・rolify 概要 3つのGemを使用して、権限付き認証機能を実装します。 gem インストール Gemfile ...

Rails devise で複数モデルの認証機能を実装

Rails devise で複数モデルを管理 概要 rails のログイン認証 Gem「devise」のインストール・設定方法を紹介します。 よく「d...
トップへ戻る