PHP/GD/画像の編集

1月 1, 2003 · Posted in GD, PHP · Comment 

流れ

基本的に、GDを利用した画像処理の流れは、
-イメージオブジェクトの作成
-加工処理
-画像の保存・出力
-イメージオブジェクトの破棄
のようになります。

イメージオブジェクトの作成

まず、GDの関数を利用してイメージオブジェクトを作成する。
利用する関数は、imagecreate系。

マニュアル(http://jp2.php.net/gd)でいう、この辺。
-imagecreate
-imagecreatefromgd2
-imagecreatefromgd2part
-imagecreatefromgd
-imagecreatefromgif
-imagecreatefromjpeg
-imagecreatefrompng
-imagecreatefromstringする
-imagecreatefromwbmp
-imagecreatefromxbm
-imagecreatefromxpm
-imagecreatetruecolor

例(空白の画像を作成する)

$image = imagecreatetruecolor(300, 300);

例(jpeg画像をローカルディレクトリから読み込む)

$image = imagecreatefromjpeg("background.jpg");

例(gif画像をURLから読み込む)

$image = imagecreatefromgif("http://k.yimg.jp/images/top/sp/logo.gif");

イメージオブジェクトの編集

作成したイメージオブジェクトに対して編集処理を行う。
基本的な操作はGDライブラリで一通り実装されているので、都度、マニュアル(http://jp2.php.net/gd)から関数を探しましょう。

例:画像に文字列を描画する

<?php
$image = imagecreatetruecolor(300, 300);
$textcolor = imagecolorallocate($image, 255, 255, 255);

// 文字列の描画
imagestring($image, 5, 0, 0, "ABCDEFG", $textcolor);

// 画像を出力
imagepng($image, "image_string.png");

// イメージオブジェクトの破棄
imagedestroy($image);
?>

結果

例:画像を横に二つならべる

<?php
// イメージの作成
$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画像をファイルに保存

imagepng($image, "filename.png");

ブラウザに出力

ブラウザに出力する場合も、imageXXX系のメソッドを利用するが、content-typeヘッダを指定し、ファイル名を未指定にする。

例:ブラウザにPNG画像を出力

header("Content-type: image/png");
imagepng($image);

たとえば、<img src=’image.php’>のように呼び出す。

イメージオブジェクトの破棄

使わなくなったイメージオブジェクトは、メソッドを呼び出して破棄を行い、保持しているメモリを開放しなくてはならない。
これにはimageDestroyメソッドを利用する。

imagedestroy($image);

予期せぬエラーやdie()メソッドなどにより、処理が強制的に中断することがあるので注意!

PHP/GD/画像ジェネレーターを作る

1月 1, 2003 · Posted in GD, PHP · Comment 

ハジメに

画像ジェネレーターを作る。やることは、画像の重ねあわせとフォントの埋め込み。

素材の用意

背景

某アレ

ふきだし

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

フォント

TTFなら何でも。
今回はM+ OUTLINE FONTS(フリー)のmplus-2p-bold.ttf
http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/index.html

環境

XAMPP

→[[XAMPP]]

ディレクトリ内

背景画像の読み込み〜表示

まずは背景画像を読み込んでブラウザ(だけとは限らないが)に出力するプログラムを作る。

<?php
$image = imagecreatefrompng("sakusaku.png");

header("Content-type: image/png");
Imagepng($image);

ImageDestroy($image);
?>
1行目のimagecreatefrompng()でPNG形式の画像を読み込んでGDのオブジェクトを作成。

2行目でコンテントタイプヘッダーを指定して、3行目で画像を出力している。
最後の行でイメージオブジェクトを破棄している。

結果

http://localhost/gd/gd.php
そのまま。

噴き出しの重ね合わせ

<?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()メソッドを利用して取得している。

結果

http://localhost/gd/gd.php

文字の合成

<?php
$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

このあとは

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