↓upload_image.phpに書き換えます。
(※PHPのソースの書き方は色々あります。これでいけますが、一つの結果を出すのにいろいろなやり方があるので自分で試してください。)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
<style type="text/css">
</style>
<title>画像ファイアップロード</title>
</head>
<body>
<?php
// ファイルの取り出し
$file_name = $_FILES['filename']['name'];
// ファイル(MIMEタイプの取り出し)
$file_type = $_FILES['filename']['type'];
// 一時ファイルの取り出し
$temp_name = $_FILES['filename']['tmp_name'];
// ファイルの容量
$file_size = $_FILES['filename']['size'];
// エラー
$file_error = $_FILES['filename']['error'];
// 保存先のディレクトリ
$dir = 'uploads/'; //「ディレクトリ名+/」で記述すること
// 保存先のファイル名
$upload_name = $dir . $file_name;
// サムネイル画像の保存先ディレクトリ
$dir_s = 'uploads/s/'; //「ディレクトリ名+/」で記述すること
// サムネイル画像の保存先のファイルパス
$upload_name_s = $dir_s . $file_name;
// JPEG,GIF,PNG形式のファイルをアップロードする
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')) {
// アップロード
$result = move_uploaded_file($temp_name, $upload_name);
if ($result) {
// アップロードの成功
echo '<p>■アップロード成功</p>';
// アップロードされた画像情報を取り出す
$image_size = getimagesize($upload_name);
// アップロードされた画像の幅と高さを取り出す
$width = $image_size[0];
$height = $image_size[1];
$type = $image_size[2];
$IMG = $image_size[3];
$MIME = $image_size['mime'];
$chan = $image_size['channels'];
$bit = $image_size['bits'];
// サムネイル画像の幅と高さを決める
$width_s = 120;
$height_s = round($width_s*$height/$width);
// アップロードされた画像からサムネイル画像を取り出す
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg')){
$image = imagecreatefromjpeg($upload_name);
} elseif (($file_type == 'image/gif')) {
$image = imagecreatefromgif($upload_name);
} elseif (($file_type == 'image/png') || ($file_type == 'image/x-png')){
$image = imagecreatefrompng($upload_name);
}
// サムネイルの大きさの画像を新規作成
$image_s = imagecreatetruecolor($width_s,$height_s);
// GIFの場合の透過の設定
$black = imagecolorallocate($image_s, 0, 0, 0);
if (($file_type == 'image/gif'))
imagecolortransparent($image_s, $black);
// PNGの場合の透過の設定
if(($file_type == 'image/png') || ($file_type == 'image/x-png'))
imagealphablending($image_s, false); // アルファブレンディングをoffにする
imagesavealpha($image_s, true); // 完全なアルファチャネル情報を保存するフラグをonにする
// アップロードされた画像からサムネイル画像を作成
$result_s = imagecopyresampled($image_s, $image, 0,0, 0,0, $width_s,$height_s, $width,$height);
if ($result_s) {
// サムネイル画像作成成功
// サムネイル画像の保存
// サムネイル画像の保存
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg'))
{imagejpeg($image_s,$upload_name_s);
echo ' <p>->サムネイル画像保存</p>';
} elseif (($file_type == 'image/gif'))
{imagegif ($image_s,$upload_name_s);
echo ' <p>->サムネイル画像保存</p>';
} elseif (($file_type == 'image/png') || ($file_type == 'image/x-png'))
{imagepng($image_s,$upload_name_s);
echo ' <p>->サムネイル画像保存</p>';
} else {
echo ' <p>->サムネイル画像保存失敗</p>';
}
}
// 画像の破棄(メモリ開放)
imagedestroy($image);
imagedestroy($image_s);
} else {
// アップロードの失敗
echo '<p>■アップロード失敗</p>';
}
} else {
// JPEG、GIF、PNG以外の形式は画像をアップロードしない
echo '<p>■JPEG、GIF、PNG形式の画像をアップロードしてください。</p>';
}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){
echo '<p>■画像ファイル:'. $upload_name . '(' . $width . '×' . $height . ')' . '</p>';
} else {echo '<p>■ファイル名が見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){ echo'<p>■画像形式:' . $type . '</p>';
} else {echo '<p>■ファイル形式が見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){ echo'<p>■img属性:' . $IMG . '</p>';
} else {echo '<p>■img属性が見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){
echo'<p>■MIMEタイプ:' . $MIME . '</p>';
} else {echo '<p>■MIMEタイプが見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){
echo'<p>■色相チャンネル数:' . $chan . '</p>';
} else {echo '<p>■色相チャンネル数が見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){
echo'<p>■ビット数:' . $bit . '</p>';
} else {echo '<p>■ビット数が見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){
echo '<p><img src="' . $upload_name . '" width="250" height="188" /></p>';
} else {echo '<p>■画像が見つかりません。</p>';}
if (($file_type == 'image/jpeg') || ($file_type == 'image/pjpeg') || ($file_type == 'image/gif') || ($file_type == 'image/png') || ($file_type == 'image/x-png')){echo '<p>■サムネイル画像:' . $upload_name_s . '(' . $width_s . '×' . $height_s . ')' . '</p>';
echo '<p><img src="' . $upload_name_s . '" /></p>';
} else {echo '<p>■サムネイル画像が見つかりません。</p>';}
?>
<p>画像ファイル名:<?php echo $file_name; ?></p>
<p>MIMEタイプ:<?php echo $file_type; ?></p>
<p>一時ファイル:<?php echo $temp_name; ?></p>
<p>データ容量:<?php echo $file_size; ?></p>
<p>データの一時ファイル保存の成否:<?php echo $file_error; ?></p>
</body>
</html>
●配列
・・・複数の値を一つの名前で扱えます。(※変数は普通、一つの値しかもてないです。配列[]を使えば複数の値を持てます。 )
$○○[0]
↑これだと○○が配列名(※名前)、0が値だと思います。値は1,2,3・・・と使えます。
値が文字だと
連想配列
と呼ばれます。→$○○['name']とか
変数を入れることも可能です。→$○○[$num]とか
●getimagesize()
・・・画像サイズなどの画像ファイル情報をとりだします。
たぶんgetimagesize(画像のパス)です。
↓第1引数に画像の画像のパスを渡すと、その画像の7種類の情報を配列で返します。
キー | 値 |
---|
0 | 画像の幅 |
1 | 画像の高さ |
2 | 画像形式を表す値(GIF=1 JPG=2 PNG=3) |
3 | IMGタグ属性(width="画像の幅" height="画像の高さ") |
’mime’ | MIMEタイプ |
’channels’ | 色相チャンネル数(RGB=3,CMYK=4) |
’bits’ | 色のビット数(1bit=モノクロ,8bit=256色、24bit=フルカラー |
●サムネイルの算出
(※サムネイルとは画像一覧とか縮小された画像のことです。)
ここではサムネイルの横幅を120pxにしてます。
それに対してのサムネイルの縦幅を計算します。
だから計算式は
$width_s = 120;
に対して
height_s = round($width_*$height/$width);
になるわけです。計算式です。$widthは$heightの何%かをだし(※割り算です)その答えを$width_sにかけるわけです。その答えがheight_sになるわけです。
●round()
・・・四捨五入する関数です。上の式ではpxには自然数しかないので少数は四捨五入するわけです。
ちなみにround(10.55)だと11です。
round(10.55,1)だと10.6です。(※1の意味が小数点第一位まで残すと言う意味です。)
round(1255,-2)だと1260です。(※下二桁のところで四捨五入するという意味になります。)
その他に
ceil(□□);・・・切り上げ
floor(□□);・・・切り捨て
などの関数があります。
●imagecreatefromjpeg(ファイルパス)
・・・JPEG画像を取り出します。
そのほかにGIF,PNG,BMPに対応する関数もあります。
●imagecreatetruecolor(幅,高さ)
・・・新規画像作成です。
ここではサムネイルの幅と高さをきめたので、そのサイズで、つまり、
imagecreatetruecolor(width_s,height_s);で新規画像つくります。
トゥルーカラーとはフルカラーのことで1677万色だそうです。この状態で画像は四角い黒です。
●imagecopyresampled(貼付画像,元画像,貼付画像座標,元画像座標,貼付先サイズ(※幅、高さ),元画像サイズ(幅、高さ))
・・・画像の貼付(合成)
ここではさっき作った新規画像に貼付画像を貼り付けます。
imagecopyresampled($image_s, $image, 0,0, 0,0, $width_s,$height_s, $width,$height);となるわけです。
貼付画像の座標を元画像の座標と変えることで(※ここでは同じです)画像の合成ができるそうです。今の自分には無理そうなので、とりあえず置いときます。
●imagejpeg(画像データ,保存先のファイルパス);
・・・JPEG形式で保存です。
ちなみに元画像の形式不問です。
これでサムネイル画像の保存終了です。
このままだと一時データとしてサーバーのキャッシュメモリにバイナリデータが残ったままなので、サーバーの負担を減らす為データーを破棄します。
●imagedestroy(画像データ)
・・・画像の破棄です。
メモリの解放(ガーベコレクション、ガベコレ)っていうらしいです。
ここでは
imagedestroy($image);
imagedestrou($images);
で元画像、サムネイルのデータを破棄します。
これでsディレクトリの中にサムネイル画像が保存されているはずです。
↓画像アップローダのここまでの流れを図にしてみました。
ここまでの流れがうまくいくと、サーバーに画像をアップロードすると
↑のような表示がされます。(※画像はクリックで拡大できます。)これはCSSで装飾してあるので、本当はもっとシンプルな表示です。
PR