PHP | GDでpngやjpgのフォーマットタイプを変換する方法

2020-06-18PHP GD,PHP

GDでpngやjpgのフォーマットタイプを変換する方法

PHPのGDライブラリを使って、pngやjpg、gifなどのファイルのフォーマットを変換する方法の紹介です。

ファイルの実寸サイズを変更しない場合

ファイルの実寸サイズを変更しない前提であれば、imagecopyresampled()などを使わずに実装可能となっています。

サンプルでは変換前のファイルをjpg、変換後のファイルをpngとしてあります。

変換前のファイルタイプをチェックして振り分けて処理することで他のフォーマットのファイルタイプにも対応しています。

また、変換後のファイルタイプもpngとしてありますが、コメントアウト部分に別タイプのフォーマットも記述してあります。

//変換前の画像
$file = 'sample.jpg';

//ファイルのフォーマットを取得
$file_type = mime_content_type($file);

//ファイルのフォーマットに合わせてファイルからイメージデータを作成
switch ($file_type) {

	case 'image/jpeg':
		$img = imagecreatefromjpeg($file);
		break;

	case 'image/png':
		$img = imagecreatefrompng($file);
		break;

	case 'image/gif':
		$img = imagecreatefromgif($file);
		break;

	default:
		break;

}

//ファイルのフォーマットを指定して保存
imagepng($img, 'new.png');
imagejpeg($img, 'new.jpeg');
imagegif($img, 'new.gif');

//イメージデータの削除
imagedestroy($img);

サンプルではimagepngやimagejpegにて品質設定オプションが未指定となっていますのでデフォルトの品質設定値にて処理されます。
品質設定オプションについては以下のページをご確認下さい。

ファイルの実寸サイズを変更する場合

ファイルの実寸サイズを変更する機能を付ける場合は、imagecreatetruecolor()を使ってベースになる画像を目的のフォーマットで作成、imagecopyresampled()で重ねる方法を紹介します。

//変換前の画像
$file = 'sample.jpg';

//ファイルのサイズを取得
list($w, $h) = getimagesize($file); 

//ファイルのフォーマットを取得
$file_type = mime_content_type($file);

//ファイルのフォーマットに合わせてファイルからイメージデータを作成
switch ($file_type) {

	case 'image/jpeg':
		$img = imagecreatefromjpeg($file);
		break;

	case 'image/png':
		$img = imagecreatefrompng($file);
		break;

	case 'image/gif':
		$img = imagecreatefromgif($file);
		break;

	default:
		break;

}

//ベースとなるイメージデータを作成
$new_img = imagecreatetruecolor($w, $h);

//ベースの画像データと変換前のファイルデータを重ねる
imagecopyresampled($new_img, $img, 0, 0, 0, 0, $w, $h, $w, $h);

//ファイルのフォーマットを指定して保存
imagepng($new_img, 'new.png');
imagejpeg($new_img, 'new.jpeg');
imagegif($new_img, 'new.gif');

//イメージデータの削除
imagedestroy($img);
imagedestroy($new_img);

imagecopyresampled()のパラメータ引数

imagecopyresampled(ベース画像, 元画像, ベース画像のx座標, ベース画像のy座標, 元画像のx座標, 元画像のy座標, ベース画像の幅, ベース画像の高さ, 元画像の幅, 元画像の高さ);

座標は全て支点と考えるとスムーズにいくと思います。

サンプルでは、同サイズを指定しておりリサイズしていませんが、ベース画像と元画像の幅と高さを変更することで縮小、拡大が可能です。

imagecopyresampled()については、リサイズのページをご確認下さい。

2020-06-18PHP GD,PHP

Posted by Yousuke.U