この記事はアピリッツの技術ブログ「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);
}
下記記事を書くにあたって参考にしたサイトになります、
透過処理についての解説
References
↑1 | $image_type == 1) OR ($image_type==3 |
---|