PHP グラフィック処理 ~画像の拡大縮小~

PHP

今回は画像のサイズの変更方法について解説していきます。
画像のサイズの変更方法は2通りあります。
1つ目はimagecopyresized関数を使用する方法。
2つ目はimagecopyresampled関数を使用する方法です。
それぞれ特徴があるのでその特徴をしっかり押さえておきましょう。

imagecopyresized関数

iamgecopyresized関数は指定した画像の矩形部分をコピーしサイズを変更することができます。
処理は高速ですがリサイズ後の画像の角がギザギザになります。

imagecopyresized($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);

この後解説するimagecopyresampled関数も引数に渡せる値は同じです。

$dst_imageはコピー先となるGDImageインスタンスを渡します。

$src_imageには拡大/縮小したいimagecreatefrompng関数などで読み込んだ画像のGDImageインスタンスを渡してください。
簡単にいうとコピー元です。

$dst_xと$dst_yはコピー先の座標、$src_xと$src_yはコピー元の座標を渡します。

$dst_widthと$dst_heighにはコピー先の画像の幅と高さ、$src_widthと$src_heightにはコピー元の画像の幅と高さを渡してください。

画像の幅を取得するにはimagesx関数、高さを取得するにはimagesy関数を使用します。
取得したいGDImageインスタンスを渡すとその幅や高さを取得できます。

$soruce = imagecreatefrompng('画像までのパス');
$width = imagesx($source);
$height = imagesy($source);
echo "width: {$width}, height: {$height}";

今回はSVGPORNでダウンロードしてきたPHPのロゴ画像を縮小していきます。

// 画像読み込み
$source = imagecreatefrompng('./php.png');

// 元画像のサイズを取得
$originalWidth = imagesx($source);
$originalHeight = imagesy($source);

// コピー後のサイズを算出
$destinationWidth = $originalWidth / 2;
$destinationHeight = $originalHeight / 2;

$destination = imagecreate($destinationWidth, $destinationHeight);

// 1/4サイズに縮小
imagecopyresized($destination, $source, 0, 0, 0, 0, $destinationWidth, $destinationHeight, $originalWidth, $originalHeight);

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

元のサイズが256×135だったので縮小して128×67.5になりました。

imagecopyresampled関数

imagecopyresampled関数はimagecopyresized関数に比べ処理は遅いですが、コピーした画像のピクセルを補間し滑らかにしてくれます。

// 画像読み込み
$source = imagecreatefrompng('./php.png');

// 元画像のサイズを取得
$originalWidth = imagesx($source);
$originalHeight = imagesy($source);

// コピー後のサイズを算出
$destinationWidth = $originalWidth / 2;
$destinationHeight = $originalHeight / 2;

$destination = imagecreate($destinationWidth, $destinationHeight);

// 1/4サイズに縮小
imagecopyresampled($destination, $source, 0, 0, 0, 0, $destinationWidth, $destinationHeight, $originalWidth, $originalHeight);

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

今回は画像を縮小しただけなので画像の滑らかさはほとんど分かりませんでした。