PHP:画像をアップロードし、サーバー側で圧縮やリサイズする

広告:超オススメUnity Asset
  広告:超オススメUnity Asset

写真のアップロードし、サーバー容量を節約するために画像圧縮した上でリサイズして保管するといったことをする際のMEMOです。

iOSアプリにPHPからプッシュ通知(APNs)したいため、XserverのVPSにPHPが動作するサーバーを立ち上げる手順MEMO。(iO...

で構築したubuntuのサーバーで行うことを前提にしています。

アップロードできるサイズの許容量をあげる

デフォルトで2MBになっているので、最近のスマホで撮った画像などがこの容量を超えてアップロードできないので、まずここを変えておきます。

php.ini の中の記述を書き換えてサーバー再起動。

sudo vi /etc/php/8.1/apache2/php.ini

でphp.iniを開き、「/」を押して検索状態に入り、「upload_max_filesize」をペーストして、場所を見つけたら ENTERキーでその場所に移動。「i」を押して、編集状態にして、「10MB」程度に書き換えて、「:wq!」で保存。

sudo systemctl restart apache2

でサーバー再起動。

gd(GIF Draw:画像圧縮やリサイズ)

Php8.1-gdを入れておく。

apt search php8.1 | grep php8.1

php8.1-gd/jammy-updates,jammy-security 8.1.2-1ubuntu2.19 amd64 が見つかるので、インストール

sudo apt install php8.1-gd

画像圧縮とリサイズを行う関数

保存するディレクトリとファイル名、縦横いずれかの最大ピクセル数(省略すると800px)を引数として渡して、既存のファイルを上書きする関数をMEMOしておきます。戻り値は、メッセージ文字列です。

function resizeFilePath($img_save_path, $theFileName, $maxSizePx = 800){

	// 画像をリサイズする関数
	function resizeImage($_filePath, $_maxSize) {
		list($origWidth, $origHeight) = getimagesize($_filePath);
		$ratio = $origWidth / $origHeight;

		// 新しいサイズを計算(縦横比を維持し、最大幅または高さを800pxにする)
		if ($origWidth > $origHeight) {
			$newWidth = $_maxSize;
			$newHeight = $_maxSize / $ratio;
		} else {
			$newHeight = $_maxSize;
			$newWidth = $_maxSize * $ratio;
		}

		// 元の画像リソースを作成
		$image = imagecreatefromstring(file_get_contents($_filePath));
		$resizedImage = imagecreatetruecolor($newWidth, $newHeight);

		// 画像をリサイズ
		imagecopyresampled($resizedImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $origWidth, $origHeight);
		imagedestroy($image);

		return $resizedImage;
	}

	$filePath = $img_save_path.DS.$theFileName;
	$fileType = mime_content_type($filePath);

	// 画像タイプのチェック(JPEGとPNGに対応)
	if ($fileType === 'image/jpeg' || $fileType === 'image/png') {
		// 画像のリサイズ
		$resizedImage = resizeImage($filePath, $maxSizePx);  // 最大幅または高さを800pxにリサイズ

		// 解像度を72 DPIに設定
		imageresolution($resizedImage, 72, 72);

		// 圧縮率を指定して元のファイルに上書き保存(JPEGの場合は圧縮率、PNGの場合は圧縮レベル)
		if ($fileType === 'image/jpeg') {
			imagejpeg($resizedImage, $filePath, 75); // 75は圧縮率
		} else if ($fileType === 'image/png') {
			imagepng($resizedImage, $filePath, 8); // 0-9の範囲で圧縮(9が最大圧縮)
		}

		// メモリを解放
		imagedestroy($resizedImage);

		return '画像がリサイズおよび圧縮され、保存されました: '; //. $filePath;
	} else {
		return 'JPEGまたはPNG画像のみ対応しています。';
	}
}

以上

スポンサーリンク