PHP | GDでjpegやPNGファイルをWebPに変換する方法

PHP GD,PHP

PHP | GDでjpegやPNGファイルをWebPに変換する方法

PHPのGDライブラリでjpeg画像やpng画像をWebPファイルへ変換する方法の紹介です。

サーバーのPHP-GDライブラリがWebPに対応している必要はありますが、利用方法は他ファイルタイプと同様にimagecreatefromwebp()やimagewebp()として使えるので、一度でもGDライブラリを使ったことのある人であれば、なんとなくで簡単に実装できそうです。

GDでjpegやPNGファイルをWebPに変換

下地画像データを作成なしで、imagecopyresampled()などを使わずそのまま変換する方法です。

//元画像ファイル
$file = 'sample.png';

//元画像ファイルのタイプで分岐処理
switch (mime_content_type($file)) {

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

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

	case 'image/webp':
		$img = imagecreatefromwebp($file);
		break;

	default:
		break;

}

//ファイル名を指定して元画像データからWebP画像を作成
imagewebp($img, 'new.webp');

imagewebpのパラメータ引数の説明

imagewebp(画像データ, 作成するファイルパス. 品質);

imagewebp()の品質(quality)は、0~100の間で設定します。
デフォルトは80、0に近いほど低品質で100が最高品質です。

imagejpeg()などのほかのフォーマットと同様に、imageWebp()やimageWEBP()など、大文字を含ませても機能します。

また、この方法では、gifからWebPへの変換では「Paletter image not supported by webp」とエラーが出て、変換できないことが確認できています。

現状、静止画のgif画像を変換するケースは少ないと思いますが、gif画像からの変換に対応したい場合や、リサイズ機能も含めたい場合は、下地画像を作成して元画像を重ねるする次の方法を利用します。

//元画像ファイル
$file = 'sample.png';

//元画像ファイルのタイプで分岐処理
switch (mime_content_type($file)) {

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

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

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

	case 'image/webp':
		$img = imagecreatefromwebp($file);
		break;

	default:
		break;

}

//ベース画像を作成して、元画像を重ねる
$new_img = imagecreatetruecolor($w, $h);
imagecopyresampled($new_img, $img, 0, 0, 0, 0, $w, $h, $w, $h);

//ファイルのフォーマットを指定して保存
imagewebp($new_img, 'new.webp');

サンプルではリサイズなしなので、ベース画像のサイズは元画像のサイズと同じにして作成しています。

imagecopyresampled()のパラメータ引数の簡単な説明

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

PHP GD,PHP

Posted by Yousuke.U