ホーム DoRuby 【PHP】画像アップロードとリサイズの仕方(フォームの生成~リサイズ処理の方法)

【PHP】画像アップロードとリサイズの仕方(フォームの生成~リサイズ処理の方法)

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

【PHP】画像アップロードとリサイズの仕方(フォームの生成~リサイズ処理の方法)

 フォーム生成からアップロードされた画像を保存する。

プロジェクト内で画像のアップロードからリサイズ処理を見ることがあったので、

勉強がてら処理内容を追ってみました。

  • 1.フォームの生成
  • 2.アップロードされたファイル情報取得
  • 3.画像の保存方法

1. フォームの生成

 <form action="アクション先" method="post" enctype="multipart/form-data">
   <input type="file" name="upload_file" />
   <input type="submit" value="アップロード" />
</form>

※ formタグのmethodをpostに、enctype=”multipart/form-data”を指定する必要があります。

2. アップロードされたファイル情報取得

アップロードされたファイルの情報は $_FILES に格納されます。

$_FILES は $_POST や $_GET と同様、PHPが自動的に値をセットしてくれる連想配列です。

また、アップロードしたファイルは一時的にサーバー側に保存され、PHPプログラムの実行が終了すると削除されるそうです。

$upload_file = $_FILES["upload_file"];
array(5) {
  ["name"]=>
  string(10) "Desert.jpg"
  ["type"]=>
  string(10) "image/jpeg"
  ["tmp_name"]=>
  string(14) "/tmp/phph8PFva"
  ["error"]=>
  int(0)
  ["size"]=>
  int(845941)
}
  • name →アップロードファイル名
  • type →MIMEタイプ
  • tmp_name →アップロードされたファイルが一時的に保存されたファイルパス
  • error →エラーコード(正常にアップロードされた場合、0になります)
  • size →アップロードされたファイルサイズ

となっています。

3. 画像の保存方法

アップロードされた画像は一時的に、tmp_name値で指定された箇所に保存されています。

move_uploaded_file()を用いて、別ディレクトリに移動させます。

move_uploaded_file( $upload_file["tmp_name"], ‘/img/upload/');

とここまでの手順で、アップロードされた画像を保存することが可能です。

4. 画像をリサイズするサンプルコード

下記の1.~6.までの手順をサンプルに落としてみました。

1.画像情報を取得する

2.画像をコピー

3.空画像を作成

4.コピー画像を指定サイズで作成

5.コピー画像を保存

6.画像データ破棄

$orig_file 元画像

$resize_weight リサイズ幅

$resize_height リサイズ高さ

function sample_resize($orig_file, $resize_weight, $resize_height)
{
	// GDライブラリがインストールされているか
	if (!extension_loaded('gd')) {
	    // エラー処理
	    return false;	
	}

	// 画像情報取得
	$result = getimagesize($orig_file);
	list($orig_width, $orig_height, $image_type) = $result;
	
	// 画像をコピー
	switch ($image_type) {
	    // 1 IMAGETYPE_GIF
	    // 2 IMAGETYPE_JPEG
	    // 3 IMAGETYPE_PNG
            case 1: $im = imagecreatefromgif($orig_file); break;
            case 2: $im = imagecreatefromjpeg($orig_file);  break;
            case 3: $im = imagecreatefrompng($orig_file); break;
            default: //エラー処理 
          return false;
        }	

	// コピー先となる空の画像作成
	$new_image = imagecreatetruecolor($resize_width, $resize_height);
        if (!$new_file) {
            // エラー処理 
	    // 不要な画像リソースを保持するメモリを解放する
            imagedestroy($im);
            return false;
        }

 	// GIF、PNGの場合、透過処理の対応を行う
	if [1]$image_type == 1) OR ($image_type==3 {
            imagealphablending($new_image, false);
            imagesavealpha($new_image, true);
            $transparent = imagecolorallocatealpha($new_image, 255, 255, 255, 127);
            imagefilledrectangle($new_image, 0, 0, $resize_width, $resize_height, $transparent);
        }

	// コピー画像を指定サイズで作成
 	if (!imagecopyresampled($new_image, $im, 0, 0, 0, 0, $resize_width, $resize_height, $orig_width, $orig_height)) {
            // エラー処理
	  // 不要な画像リソースを保持するメモリを解放する
            imagedestroy($im);
            imagedestroy($new_image);
            return false;
        }

        // コピー画像を保存
	// $new_image : 画像データ
	// $new_fname : 保存先と画像名
        // クオリティ

        switch ($image_type) {
	    // 1 IMAGETYPE_GIF
	    // 2 IMAGETYPE_JPEG
	    // 3 IMAGETYPE_PNG
            case 1: $result = imagegif($new_image, $new_fname, $quality); break;
            case 2: $result = imagejpeg($new_image, $new_fname, $quality); break;
            case 3: $result = imagepng($new_image, $new_fname, $quality); break;
            default: //エラー処理 
          return false;
        }

        if (!$result) {
            // エラー処理 
	    // 不要な画像リソースを保持するメモリを解放する
            imagedestroy($im);
            imagedestroy($new_image);
            return false;
        }

	// 不要になった画像データ削除
	imagedestroy($im);
        imagedestroy($new_image);

}

下記記事を書くにあたって参考にしたサイトになります、

透過処理についての解説

http://www.phppro.jp/qa/1269

References

References
1 $image_type == 1) OR ($image_type==3
記事を共有

最近人気な記事