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人目のお客様です。上記のスクリプトから、一回目にアクセスした場合は、「あなたは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」となります。