[Site] 画像アップロード (編集)

タグ :

作成サイト「koweboo」についてまとめるシリーズです。
今回は前記事に続いて「画像編集処理」についてまとめます。

画像についての基礎知識は、過去記事「画像の取り扱い」を参照してください。

処理の仕様

まず始めに仕様をまとめておこうと思います。
処理の要項としては以下になります。

  • 変数の初期化
  • 画像情報の取得
  • リサイズ処理
  • 画像の保存処理
  • メモリの解放

処理は要項毎に関数化し、扱いやすくしたいと思います。

処理はコンポーネント内で完結させればよいので、変数はそのコンポーネント全体で有効な「$this->(変数名)」を使用します。

また、処理量が多くなるので、コンポーネント化して使いやすくしたいと思います。
「/app/Controller/Component/」内へ「ImageComponent.php」を作成します。
コンポーネントに必要な記述を忘れずに書いておきます。

class ImageComponent extends Object {
	function initialize(){}
	function beforeRender(){}
	function shutdown(){}
	function startup(&$controller) {
		$this->Controller = & $controller;
	}
	function 関数名() {
		~ 処理 ~
	}
}

「~ 処理 ~」へそれぞれの要項の処理を記述していきます。

変数の初期化

まずは、初期化処理からです。
画像を扱う場合、メモリを意識して処理を行うことは重要です。
使用するメモリが大きいと動作が遅くなったり、メモリを使い過ぎて思わぬ現象を引き起こしてしまう可能性があるからです。
そのため、まずは使用するメモリ領域を確保しておくためにも変数を宣言して初期化させておく必要があります。

function Init() {
	$this->srcImage = '';	// 元画像データ
	$this->srcSize = array();	// コピー元サイズ
	$this->srcWidth = 0;	// コピー元画像の幅
	$this->srcHeight = 0;	// コピー元画像の高さ
	$this->srcType = '';	// コピー元画像の形式
	$this->newWidth = 0;	// コピー先画像の幅
	$this->newHeight = 0;	// コピー先画像の高さ
	$this->newImage = '';	// コピー画像リソースID
	$this->saveImage = '';	// 保存画像リソースID
	
	return;
}

特に説明はいらないと思います。
各変数の使い道はコメント文の通りです。

画像情報の取得

続いてはアップロードしたい画像の基本情報を取得する処理を作成します。

function SetImage($data = null) {
	if(!$data['tmp_name'] || !$data['type']) {
		return false;
	}
	// 初期化
	$this->Init();
	// 画像情報取得
	$this->srcImage = $data['tmp_name'];
	list($this->srcWidth, $this->srcHeight) = GetImageSize($this->srcImage);
	$this->srcType = $data['type'];
		
	return true;
}

1行目関数の引数として画像情報の受け取りを行います。

2行目でアップロードするファイルが在るかをチェックしています。
ファイルが無い、もしくは不適切なファイルの場合はエラーとしてはじかれます。

9行目では画像のサイズを取得しています。
list() でそれぞれの変数へ GetImageSize() の戻り値を格納させることができます。

10行目で画像種類(拡張子)を取得しています。

リサイズ処理

画像を編集する処理を作成します。
編集といっても今回はサイズを変更するだけです。

function Resize($val_size) {
	// 画像読み込み
	switch($this->srcType) {
	  case IMG_TYPE_GIF:
		$this->newImage = ImageCreateFromGIF(
					$this->srcImage
					);
		$ret = IMG_GIF_FILEEXT;
		break;
	case IMG_TYPE_JPG:
		$this->newImage = ImageCreateFromJPEG(
					$this->srcImage
					);
		$ret = IMG_JPG_FILEEXT;
		break;
	case IMG_TYPE_PNG:
		$this->newImage = ImageCreateFromPNG(
					$this->srcImage
					);
		$ret = IMG_PNG_FILEEXT;
		break;
	default:
		return false;
	}
	// リサイズ
	$this->newWidth = $val_size;
	$rate = $this->newWidth / $this->srcWidth;
	$this->newHeight = ceil($this->srcHeight * $rate);
	$this->saveImage = ImageCreateTrueColor(
				$this->newWidth,
				$this->newHeight
				);
	// コピー
	ImageCopyResampled(
				$this->saveImage,$this->newImage,
				0, 0, 0, 0,
				$this->newWidth, $this->newHeight,
				$this->srcWidth, $this->srcHeight
				);
	// 背景色
	ImageAlphaBlending($this->saveImage, false);
	ImageSaveAlpha($this->saveImage, true);
	$fillcolor = ImageColorAllocateAlpha($this->saveImage, 255, 255, 255, 127);
	ImageFill($this->saveImage, 0, 0, $fillcolor);
	// 読み込み画像の解放
	$this->Free($this->newImage);
	
	return $ret;
}

1行目の関数の引数としてリサイズするサイズを指定できるようにしています。

3行目〜24行目にて画像ファイルの種類別に画像を作成しています。

26行目〜32行目の処理で保存用のファイルを新規に作成します。
今回の処理では、画像の幅を基準にしたサイズの画像を生成させています。

34行目〜39行目の処理で画像の再サンプリングを行い、サイズを変更した画像を生成させています。

41行目〜44行目で背景色の設定を行っています。
画像の幅を基準にサイズの変更を行うので、余白が出来てしまう場合には、その余白を背景色で埋めた方が良いと思います。
今回の背景色は「白」で設定しています。

46行目では読み込み用に確保したメモリ領域の解放を行います。

48行目で戻り値として画像の種類(拡張子)を返します。

画像の保存処理

画像の保存を行う処理を作成します。
専用フォルダへ画像を保存します。

function Save($str_size, $name, $path) {
	// 保存
	$fileName = $path.$name.$str_size;
	switch($this->srcType) {
	case IMG_TYPE_GIF:
		$fileName .= IMG_GIF_FILEEXT;
		ImageGIF($this->saveImage, $fileName);
		$name .= IMG_GIF_FILEEXT;
		break;
	case IMG_TYPE_JPG:
		$fileName .= IMG_JPG_FILEEXT;
		ImageJPEG($this->saveImage, $fileName);
		$name .= IMG_JPG_FILEEXT;
		break;
	case IMG_TYPE_PNG:
		$fileName .= IMG_PNG_FILEEXT;
		ImagePNG($this->saveImage, $fileName);
		$name .= IMG_PNG_FILEEXT;
		break;
	default:
		$this->Free($this->saveImage);
		return false;
	}
	// コピー画像の解放
	$this->Free($this->saveImage);
	
	return true;
}

1行目の関数の引数としてファイル名とフォルダパスを受け取ります。
ファイル名 + サイズ(S or M)の文字列で保存することにします。

4行目〜23行目で画像の種類別に保存処理を実行させています。
保存にはフォルダパスとファイル名の情報が必要です。

27行目でコピー用に確保したメモリの解放を行います。

メモリの解放

メモリの解放処理を作成します。
内容は単的です。

function Free($img) {
	// メモリ解放
	if(Is_Resource($img)) {
		ImageDestroy($img);
	}
	
	return;
}

4行目の処理のてメモリ領域の解放が実行されます。

これら画像リサイズのコンポーネントを使用して、画像のアップロード処理を作成したいと思います。
アップロード処理については次回になります。。。

Share

  • このエントリーをはてなブックマークに追加

Comment

コメントを残す

*がついている欄は必須項目です。

  • Twitter
  • Facebook
  • Google Plus
  • RSS Feed