PHP/GD/画像の編集
流れ
基本的に、GDを利用した画像処理の流れは、
-イメージオブジェクトの作成
-加工処理
-画像の保存・出力
-イメージオブジェクトの破棄
のようになります。
イメージオブジェクトの作成
まず、GDの関数を利用してイメージオブジェクトを作成する。
利用する関数は、imagecreate系。
マニュアル(http://jp2.php.net/gd)でいう、この辺。
-imagecreate
-imagecreatefromgd2
-imagecreatefromgd2part
-imagecreatefromgd
-imagecreatefromgif
-imagecreatefromjpeg
-imagecreatefrompng
-imagecreatefromstringする
-imagecreatefromwbmp
-imagecreatefromxbm
-imagecreatefromxpm
-imagecreatetruecolor
例(空白の画像を作成する)
例(jpeg画像をローカルディレクトリから読み込む)
例(gif画像をURLから読み込む)
イメージオブジェクトの編集
作成したイメージオブジェクトに対して編集処理を行う。
基本的な操作はGDライブラリで一通り実装されているので、都度、マニュアル(http://jp2.php.net/gd)から関数を探しましょう。
例:画像に文字列を描画する
$image = imagecreatetruecolor(300, 300);
$textcolor = imagecolorallocate($image, 255, 255, 255);
// 文字列の描画
imagestring($image, 5, 0, 0, "ABCDEFG", $textcolor);
// 画像を出力
imagepng($image, "image_string.png");
// イメージオブジェクトの破棄
imagedestroy($image);
?>
結果

例:画像を横に二つならべる
// イメージの作成
$image = imagecreatefromjpeg("images.jpg");
// 幅、高さの取得
$width = ImageSX($image);
$height = ImageSY($image);
$newCanvas = imagecreatetruecolor($width * 2, $height);
imageCopy($newCanvas, $image, 0, 0, 0, 0, $width, $height);
imageCopy($newCanvas, $image, $width, 0, 0, 0, $width, $height);
// 画像を出力
imagepng($newCanvas, "copyimage.png");
// イメージオブジェクトを破棄
imagedestroy($newCanvas);
imagedestroy($image);
?>
結果
元画像

編集後画像

画像の保存・出力
ファイルに出力する方法とブラウザに直接ストリームとして出力する方法がある。
ファイル出力
作成したイメージをファイルに保存するには、imageXXX系のメソッドを利用する。
例:png画像をファイルに保存
ブラウザに出力
ブラウザに出力する場合も、imageXXX系のメソッドを利用するが、content-typeヘッダを指定し、ファイル名を未指定にする。
例:ブラウザにPNG画像を出力
imagepng($image);
たとえば、<img src=’image.php’>のように呼び出す。
イメージオブジェクトの破棄
使わなくなったイメージオブジェクトは、メソッドを呼び出して破棄を行い、保持しているメモリを開放しなくてはならない。
これにはimageDestroyメソッドを利用する。
予期せぬエラーやdie()メソッドなどにより、処理が強制的に中断することがあるので注意!
PHP/GD/画像ジェネレーターを作る
ハジメに
画像ジェネレーターを作る。やることは、画像の重ねあわせとフォントの埋め込み。
素材の用意
背景
某アレ

ふきだし
インターネットから拾ってきた。透過GIF

フォント
TTFなら何でも。
今回はM+ OUTLINE FONTS(フリー)のmplus-2p-bold.ttf
http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/index.html
環境
XAMPP
→[[XAMPP]]
ディレクトリ内
背景画像の読み込み〜表示
まずは背景画像を読み込んでブラウザ(だけとは限らないが)に出力するプログラムを作る。
$image = imagecreatefrompng("sakusaku.png");
header("Content-type: image/png");
Imagepng($image);
ImageDestroy($image);
?>
1行目のimagecreatefrompng()でPNG形式の画像を読み込んでGDのオブジェクトを作成。
2行目でコンテントタイプヘッダーを指定して、3行目で画像を出力している。
最後の行でイメージオブジェクトを破棄している。
結果
http://localhost/gd/gd.php
そのまま。

噴き出しの重ね合わせ
$image = imagecreatefrompng("sakusaku.png");
$fukidashiImage = imagecreatefromgif("fukidashi.gif");
imageCopy($image, $fukidashiImage, 210, 30, 0, 0,
ImageSX($fukidashiImage),
ImageSY($fukidashiImage)
);
ImageDestroy($fukidashiImage);
header("Content-type: image/png");
Imagepng($image);
ImageDestroy($image);
?>
噴き出し画像の読み込みは、画像の形式がGIFなのでimagecreatefromgif()メソッドを利用している。
次にimageCopy()メソッドで背景画像の上に画像を重ね合わせている。重ねる位置はX:210/Y:30を指定。
画像のサイズは、縦横それぞれImageSX(), ImageSY()メソッドを利用して取得している。
結果
文字の合成
$image = imagecreatefrompng("sakusaku.png");
$fukidashiImage = imagecreatefromgif("fukidashi.gif");
imageCopy($image, $fukidashiImage, 210, 30, 0, 0,
ImageSX($fukidashiImage),
ImageSY($fukidashiImage)
);
ImageDestroy($fukidashiImage);
$text = "鳥取ってドコ?";
$text = mb_convert_encoding($text, "UTF-8", "euc-jp");
$fontPath = "mplus-2p-bold.ttf";
$fontColor = ImageColorAllocate($image, 0, 0, 0);
ImageTTFText($image, 20, 0, 240, 115, $fontColor, $fontPath, $text);
header("Content-type: image/png");
Imagepng($image);
ImageDestroy($image);
?>
mb_convert_encoding()メソッドを利用して文字列をUTF-8エンコードしている。
ImageTTFText()メソッドで文字列を埋め込み。
2番目の引数から順に、フォントサイズ、文字の角度、文字のx位置、文字のy位置。
結果
かんせい
http://localhost/gd/gd.php

このあとは
文字列のエスケープとキャッシュ処理を入れてみましょう。


