【PHP】画像をリサイズして特定のディレクトリに格納する

【PHP】画像をリサイズして特定のディレクトリに格納する

こんにちは。
今日は、PHPを使ったサーバー上にある画像をコピーしてリサイズする方法についてです。

やりたいこと

とあるクライアントの商品管理システムを開発中なのですが、
商品の画像をアップロードしたタイミングで、
その画像をコピーして大、中、小、極小にリサイズする必要があります。
(なぜそんな訳のわからないことを..という声が聞こえてきそうですが、
これには深い訳があります。諸事情あって言えませんが(゚∀゚))

その処理を書いて、とりあえず安定稼働しているので、
同じケースはそうそう無いと思いますが、誰かの役に立つ気がしたので、
共有したいと思います。

やりたいことは
サーバー上にある画像を対象に、所定のサイズにリサイズする、です。

実際のコード

それでは、実際にコードを見てみましょう。

create_images('original.jpg');

//********************
//画像生成処理
//********************
function create_images($original_image){
	//新しいファイルの名前
	$new_image = 'new.jpg';

	//リサイズ元となる画像のURLを指定
	$source_file_path = 'http://hogehoge.com/img/' . $original_image;

	//それぞれのサイズにリサイズする
	resize_image($new_image,$source_file_path,'/img/large/',400,400); //大サイズ
	resize_image($new_image,$source_file_path,'/img/medium/',150,150); //中サイズ
	resize_image($new_image,$source_file_path,'/img/small/',100,100); //小サイズ
	resize_image($new_image,$source_file_path,'img/mini/',60,60); //極小サイズ
	return true;
}

//********************
//画像リサイズ処理
//********************
function resize_image($new_image, $source_file_path, $make_dir, $width, $height){

	//ディレクトリの存在確認
	if(!file_exists($make_dir)){
		mkdir($make_dir); //ディレクトリ作成
		chmod($make_dir,0777); //権限付与
	}

	//リサイズ元ファイルのサイズを取得
	list($w, $h) = getimagesize($source_file_path);
	$baseImage = imagecreatefromjpeg($source_file_path);

	//新たに作るファイルが存在するか確認
	//※常に上書きしても問題なければ、このif文は不要。
	if(!file_exists($make_dir . $new_image)){
		$image = imagecreatetruecolor($width, $height);
		imagecopyresampled($image,  $baseImage, 0, 0, 0, 0, $width,  $height,  $w, $h);
		imagejpeg($image ,$make_dir . $new_image);
	}
	return true;
}

resize_image()が、実際にリサイズする処理を書いている部分で、
create_images()は、リサイズ元のファイルのパスと、新たに作るファイル名をもとにresize_image()をコールしているだけです。

本当は、create_images()内の以下の変数を引数にした方が、
create_images()を使わなくて済むし、汎用性が出てくると思います。

  • 新しいファイル名
  • 新しいファイルを格納するディレクトリ
  • リサイズ元のファイルのパス
  • 新しいファイルのサイズ

しかし、この方がパッと見た時に理解しやすいかなと思い、こう書いています。
実際に引用する際は、リファクタリングしてください。

実際に使う場面を考えた時、
例えば、複数の画像パスを持った配列を宣言して、
一行目のcreate_imagesのコール部分を繰り返すようにして、
画像リサイズのバッチ処理にしてもいいかもしれないですね。

まとめ

いかがでしょうか?
ここに記載したコードで気をつけるべきは、
リサイズ元のファイルの名前ではなく、ファイルのURLを指定する部分でしょうか。
つまり、サーバー上にあってURLを叩けば参照できる状態でないといけないということです。
あとは、ディレクトリの作成と権限付与の部分ですね。

ちょっと気になっているのは、
create_images()の関数名がどうにかならないかな..と思っています。
実際にはimageファイルを作っている訳ではないし、
というより、そもそもresize_image()をコールしているだけですね。

自分で定義した複数の関数を、まとめてコールするためだけの関数を宣言することが多々あるのですが、
名前をつけるのに微妙に悩むことがあります。
そもそもこれってあまり良くない書き方でしょうか?

ということでこれを機に調べてみようと思います。
では。