画像操作

画像を生成する

画像の操作

PHPは、※GDライブラリを通して以下の画像操作を実行することができます。

  • 画像の生成、削除、サイズ変更、修正
  • 基本図形の描画
  • テキストの生成とフォントの操作
  • 色彩の操作
  • ピクセル操作

※GDライブラリとは・・・
CGIや各種プログラムから画像の作成・編集を行うためのライブラリです。PHP4.3.0からは標準で実装されています。

PHPでは、簡単な図形から複雑な画像までテキストベースで描画する機能が備わっています。外部の画像ファイルを直接読み込んで、Webブラウザに出力することも可能です。また、様々なテキストを読み込んで、画像に埋め込むこともできます。

操作できる画像形式

インターネットで画像を扱う際に使われる画像形式には、GIF、JPEG、PNGなど様々あります。もともと、PHPの画像操作で使うことができる形式はGIFのみでしたが、現在ではGIFに関する機能が削除され、PNGとJPEGフォーマットをサポートするように変更されています。

基本的な図形を描写する

直線を引く

imageline()関数を使用して、指定された2点を結ぶ直線を引くことができます。

直線を描画する

    <?php

        header( "Content-Type: image/png" );
        $image = imagecreate( 120, 120 );

        $green = imagecolorallocate( $image, 131, 195, 28 );
        $white = imagecolorallocate( $image, 255, 255, 255 );

        imageline( $image, 10, 60, 110, 60, $white );
        imagepng( $image );
        imagedestroy( $image );
    ?>
    

指定した大きさの空の画像を表す画像IDを返すimagecreate()関数を使用して、背景となる正方形の画像を生成します。

imagecreate( int width, int height );

imagecolorallocate()関数を使用して、利用する色を指定します。

imagecolorallocate( resource image, red, green, blue );

imageline()関数を使用して、描画した画像の上に直線を書きます。

imageline( image, 始点x座標, 始点y座標, 終点x座標, 終点y座標, color );

imagepng()関数を使用して、PNGイメージをブラウザまたはファイルに出力します。

imagepng( resource image [, string filename ] );

imagedestroy()関数を使用して、PHPで表現された画像をメモリ上から解放します。

imagedestroy( resource image [, string filename ] );

実行結果

直線

図形を生成する

図形を描くための様々な関数を組み合わせて、基本的な図形から複雑なものまで描くことができます。

下記のスクリプトとも、imagecreate()関数を使用して、背景となる正方形の画像を生成し、その上にimagearc()関数imagerectangle()関数を使って、楕円形と長方形を描画しています。

楕円形を描画する

    <?php

        header( "Content-Type: image/png" );
        $image = imagecreate( 120, 120 );

        $green = imagecolorallocate( $image, 131, 195, 28 );
        $white = imagecolorallocate( $image, 255, 255, 255 );

        imagearc( $image, 60, 60, 100, 60, 0, 360, $white );
        imagepng( $image );
        imagedestroy( $image );
    ?>
    

imagearc()関数は楕円を描画します。

imagearc( image, 中心x座標, 中心y座標, int width, int height, 開始角度, 終了角度, color );

実行結果

楕円形

長方形を描画する

    <?php

        header( "Content-Type: image/png" );
        $image = imagecreate( 120, 120 );

        $green = imagecolorallocate( $image, 131, 195, 28 );
        $white = imagecolorallocate( $image, 255, 255, 255 );

        imagerectangle( $image, 20, 40, 100, 80, $white );
        imagepng( $image );
        imagedestroy( $image );
    ?>
    

imagerectangle()関数は

imagerectangle( image, 左上x座標, 左上y座標, 右下x座標, 右下y座標, color );

実行結果

長方形

画像を操作して拡大または縮小する

画像を操作して拡大または縮小する

例えば、Webのショッピングサイトで、ページにずらりと表示されている小さな写真から、気になった品物の写真を選択すると、その品物の拡大写真が表示されます。

サムネイルとは・・・

Thumbnail クラスを使えば超簡単にサムネイルが作れます。

画像を拡大する

    <?php

        $size = getimagesize( "dl_button.png" );
        $image_in = imagecreatefrompng( "dl_button.png" );
        $image_out = imagecreate( $size[ 0 ] * 1.2, $size[ 1 ] * 1.2 );

        imagecopyresized( $image_out, $image_in, 0, 0, 0, 0, $size[ 0 ] * 1.2, $size[ 1 ] * 1.2, $size[ 0 ], $size[ 1 ] );

        imagepng( $image_out, "large.png" );
        imagedestroy( $image_in );
        imagedestroy( $image_out );
    ?>

    <img src = "dl_button.jpg" border = "0">
    <img src = "large.png" border = "0">
    

上記のスクリプトでは、getimagesize()関数で、指定した画像ファイルの大きさに関する情報を配列として取得し、imagecreatefrompng()関数で、画像のコピーを作成します。

そして、imagecreate()関数で、縦横2倍に拡大した画像を生成して、指定した画像の矩形部分(矩形とは、正方形と長方形の総称)を別の画像へコピーするimagecopyresized()関数で、実際に拡大した画像をコピーします。

なお、<img src = "">とは、HTMLの<img>タグにWebページ上で展開するファイルのURI(絶対パス、相対パス)を指定したもので、このsrc属性は、ブラウザに画像を表示させるためには必須の属性です。

実行結果

拡大画像

画像の大きさを取得する。

getimagesize( filename, [ imageinfo ] );

ファイルまたはURLから新規PNG画像を作成する。

imagecreatefrompng( filename );

画像の一部の複製とサイズを変更。

imagecopyresized( dst_image, src_image, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h );
dst_image コピー先の画像リンクリソース。
src_image コピー元の画像リンクリソース。
dst_x コピー先のx座標。
dst_y コピー先のy座標。
src_x コピー元のx座標。
src_y コピー元のy座標。
dst_w コピー先の幅。
dst_h コピー先の高さ。
src_w コピー元の幅。
src_h コピー元の高さ。

画像を縮小する

    <?php

        $size = getimagesize( "dl_button.png" );
        $image_in = imagecreatefrompng( "dl_button.png" );
        $image_out = imagecreate( $size[ 0 ] / 2, $size[ 1 ] / 2 );

        imagecopyresized( $image_out, $image_in, 0, 0, 0, 0, $size[ 0 ] / 2, $size[ 1 ] / 2, $size[ 0 ], $size[ 1 ] );

        imagepng( $image_out, "small.png" );
        imagedestroy( $image_in );
        imagedestroy( $image_out );
    ?>

    <img src = "dl_button.png" border = "0">
    <img src = "small.png" border = "0">
    

上記のスクリプトでは、縦横を半分の大きさにした縮小画像を、imagecreate()関数で生成して、そこにimagecopyresized()関数で実際に縮小した画像をコピーしています。

実行結果

縮小画像

画像へテキストを埋め込む

生成した画像へテキストを埋め込む

バナー広告のプレートなどのように、画像に任意のテキストを埋め込んで、画像とテキストを一緒に表示する場合もあります。

テキストを描画する

    <?php

        header( "Content-Type: image/png" );
        $image = imagecreate( 120, 120 );

        $green = imagecolorallocate( $image, 131, 195, 28 );
        $white = imagecolorallocate( $image, 255, 255, 255 );

        $message = "PHP Beginner";
        $start_x = 60 - ( strlen( $message ) * imagefontwidth( 5 ) / 2 );
        $start_y = 60 - imagefontheight( 5 ) / 2;

        imagestring( $image, 5, $start_x, $start_y, $message, $white );

        imagepng( $image );
        imagedestroy( $image );
    ?>
    

上記のスクリプトでは、imagecreate()関数で生成した画像に、指定されたテキスト「PHP Beginner」を、imagestring()関数で埋め込んでいます。

strlen()関数で文字列の長さを、imagefontwidth()関数でフォントの幅を、imagefontheight()関数でフォントの高さをそれぞれ取得します。

実行結果

生成した画像に、指定されたテキストを埋めこむ。

文字列を水平に描画する。

imagestring( image, font, x, y, string string, color );

文字列の長さを取得する。

strlen( string, $string );

フォントの幅を取得する。

imagefontwidth( int font );

フォントの高さを取得する。

imagefontheight( int font );

これまで学習した画像関数を使用して、画像の色や大きさ、形、テキストの色やフォントを変えて、いろいろな画像を描いてみてください。

アクセスカウンター

アクセスカウンターとは、あるWebページに何回アクセスがあったかを数えるプログラムおよびその表示結果のことです。

アクセスカウンターを使用して、「あなたは○○人目のお客様です」のようにページ上に表示されているWebサイトも多々あります。高機能なものになると、アクセス記録を取って解析する機能を持ったものや、同一アドレスからの連続アクセスを除外する機能を持つものなどもあります。

今回はまず、「ファイル操作」の「ファイルを開く」でローカルディスク(C:)直下に作成したtemplateディレクトリに、「count.txt」というテキストファイルを作成します。「count.txt」には「0」とだけ入力します。

アクセスカウンターを作成

    <?php

        $fp = fopen( "c:¥¥template¥¥count.txt", "r+" );
        $count = fread( $fp, 10 );
        $count = $count + 1;

        fseek( $fp, 0 );
        fputs( $fp, $count );
        fclose( $fp );
    ?>

    <p>あなたは <?php echo $count; ?> 人目のお客様です。</p>
    

上記のスクリプトでは、あらかじめ作成しておいたアクセス数を記録するcount.txtファイルを、読み込みおよび書き込みができるように、fopen()関数の引数に「r+」を指定して開いています。

fseek()関数は、ファイルポインタの位置を移動します。引数に「0」を指定することで、ファイル内の先頭に移動するので、加算したアクセス数をfwrite()関数で書き込むことができます。

実行結果

あなたは1人目のお客様です。
あなたは2人目のお客様です。

上記のスクリプトから、一回目にアクセスした場合は、「あなたは1人目のお客様です。」が表示され、2回目にアクセスした場合は「あなたは2人目のお客様です。」が表示されます。

ファイルポインタを移動する

fseek( resource handle, int offset [, int whence ] );
handle ファイルポインタを指定します。
offset 移動数を指定します。移動数は基準点(始点)から何バイト移動するかをバイト数で示します。
whence 省略可能なオプション引数で、始点、つまり移動の開始位置を指定します。省略した場合にはファイルの最初におかれます。第3引数で指定できる値は、※表1の「fseek()関数における始点」の通りです。

※表1.fseek()関数における始点

whence 説明
SEEK_SET 始点をファイルの最初に置く(デフォルト)
SEEK_CUR 始点を現在のファイルポインタの位置に置く
SEEK_END 始点をファイルの終端に置く

画像で生成するアクセスカウンター

    <?php

        $fp = fopen( "c:¥¥template¥¥count.txt", "r+" );
        $count = fread( $fp, 10 );
        $count = $count + 1;

        header( "Content-Type: image/png" );
        $image = imagecreate( 120, 120 );

        $green = imagecolorallocate( $image, 131, 195, 28 );
        $white = imagecolorallocate( $image, 255, 255, 255 );

        $start_x = 60 - ( strlen( $count ) * imagefontwidth( 5 ) / 2 );
        $start_y = 60 - imagefontheight( 5 ) / 2;

        imagestring( $image, 5, $start_x, $start_y, $count, $white );

        imagepng( $image );
        imagedestroy( $image );

        fseek( $fp, 0 );
        fputs( $fp, $count );
        fclose( $fp );
    ?>
    

実行結果

一回目のアクセス 二回目のアクセス

一回目のアクセス時は「1」、二回目アクセス時は「2」となります。