3,968 views
この記事は最終更新から 2594日 が経過しています。
やってみたいこと
任意のJPEG画像ファイルをWEBブラウザからアップロードし、指定領域を切り抜いてWEBブラウザに表示する。
ImageMagickではなく GDを使用する。
↓
実行サンプルはこちらです。
//www.dogrow.net/php/sample/00011/
プログラム作成
プログラムの仕様は以下の通り。
・変換可能な画像形式は JPEG, PNG, GIFの3種類とする。
・入力画像は一辺が20~1000ピクセルの画像を処理対象とする。
・出力画像サイズは入力画像サイズよりも小さいものとする。
index.php
<!DOCTYPE html> <HTML> <HEAD> <META CHARSET="UTF-8" /> <TITLE>サンプル</TITLE> </HEAD> </BODY> <?php // 画像変換処理要求? if(isset($_POST['exec'])){ try{ if(is_uploaded_file($_FILES['upfile']['tmp_name'])){ // アップロードされた画像を保存 move_uploaded_file($_FILES['upfile']['tmp_name'], 'tmp.img'); // 画像変換&表示 echo "<img src=\"img_crop.php?fpath=tmp.img&x=".$_POST['x']."&y=".$_POST['y']."&w=".$_POST['w']."&h=".$_POST['h']."\">"; } }catch(Exception $e){ echo "[".__LINE__."] Caught exception: ".$e->getMessage(); } } ?> <hr /> <form enctype="multipart/form-data" action="" method="post"> <table style="border:2px #000 solid"> <tr><th>画像ファイル</th><td><input type=file name=upfile></td></tr> <tr><th>始点X [pixel]</th><td><input type=text name=x value="0"></td></tr> <tr><th>始点Y [pixel]</th><td><input type=text name=y value="0"></td></tr> <tr><th>幅 [pixel]</th><td><input type=text name=w value="100"></td></tr> <tr><th>高さ [pixel]</th><td><input type=text name=h value="100"></td></tr> </table> <input name="exec" type="submit" value="JPEG,PNG,GIF画像の一部分を切り抜きます。"> <p style="border:2px #f00 solid;color:#f00;padding:2px;"> ・変換可能な画像形式は JPEG, PNG, GIFの3種類とする。<br /> ・入力画像は一辺が20~1000ピクセルの画像を処理対象とする。<br /> ・出力画像サイズは入力画像サイズよりも小さいものとする。 </p> </form> </BODY> </HTML>
img_crop.php
<?php crop_img($_GET['fpath'], $_GET['x'], $_GET['y'], $_GET['w'], $_GET['h']); // 画像変換&出力 function crop_img( $fpath, $x, $y, $w, $h ){ // 画像情報を取得 $ary_info = getimagesize( $fpath ); if($ary_info === FALSE){ goto tagEND; } $img_w = $ary_info[0]; $img_h = $ary_info[1]; $img_type = $ary_info[2]; // 画像サイズチェック if(($img_w > 1000) || ($img_h > 1000)){ goto tagEND; } if(($img_w < 20) || ($img_h < 20)){ goto tagEND; } // 切り抜き始点範囲チェック $x = max(0, $x); $x = min($img_w-1, $x); $y = max(0, $y); $y = min($img_h-1, $y); // 切り抜きサイズ範囲チェック $w = max(1, $w); $w = min($img_w - $x, $w); $h = max(1, $h); $h = min($img_h - $y, $h); // 矩形指定 $rect = array(); $rect['x'] = $x; $rect['y'] = $y; $rect['width'] = $w; $rect['height'] = $h; // 画像処理を選択 $func_create = NULL; $func_display = NULL; switch( $img_type ){ case IMAGETYPE_JPEG: $func_create = "imagecreatefromjpeg"; $func_display = imagejpeg; break; case IMAGETYPE_PNG: $func_create = "imagecreatefrompng"; $func_display = imagepng; break; case IMAGETYPE_GIF: $func_create = "imagecreatefromgif"; $func_display = imagegif; break; default: break; } if($func_create === NULL){ goto tagEND; } // 画像を切り抜き $im_in = $func_create( $fpath ); $im_out = imagecrop($im_in, $rect); // 画像出力 $mime_type = image_type_to_mime_type( $img_type ); header("Content-Type: ".$mime_type); $func_display( $im_out ); imagedestroy( $im_in ); imagedestroy( $im_out ); tagEND: } ?>
実行サンプルはこちらです。
//www.dogrow.net/php/sample/00011/