2,731 views
この記事は最終更新から 432日 が経過しています。
やってみたいこと
以下の投稿記事では、GDで作成した画像をHTTP経由で出力していた。
「(9) GDでアップロード画像を白黒画像に変換」
「(10) GDでアップロード画像を拡大・縮小」
「(11) GDでアップロード画像を切り抜き」
今回はGDで作成した画像を、サーバー上で画像ファイルとして保存する。
実行サンプルはこちらです。
http://www.dogrow.net/php/sample/00012/
プログラム作成
プログラムの仕様は以下の通り。
・画像を作成するまでの動作は 「(9) GDでアップロード画像を白黒画像に変換」 と同じとする。
・作成した画像をサーバー上にファイル出力し、これをWEBブラウザ上で表示する。
index.php
<!DOCTYPE html> <HTML> <HEAD> <META CHARSET="UTF-8" /> <TITLE>サンプル</TITLE> </HEAD> </BODY> <?php require_once("img_change.php"); // 画像変換処理要求? if(isset($_POST['exec'])){ try{ if(is_uploaded_file($_FILES['upfile']['tmp_name'])){ // アップロードされた画像を保存 move_uploaded_file($_FILES['upfile']['tmp_name'], 'tmp.img'); // 画像変換&表示 $new_img = "./new."; convert_img_to_file( 'tmp.img', $new_img ); echo "<img src=\"{$new_img}\">"; } }catch(Exception $e){ echo "[".__LINE__."] Caught exception: ".$e->getMessage(); } } ?> <hr /> <form enctype="multipart/form-data" action="./" method="post"> <input type="file" name="upfile"><br /> <input name="exec" type="submit" value="JPEG,PNG画像をグレースケール画像に変換します。(一辺1000ピクセル以下)"> </form> </BODY> </HTML>
img_change.php
<?php // 画像変換&出力 function convert_img_to_file( $fpath_in, &$fpath_out ){ // 画像情報を取得 $ary_info = getimagesize( $fpath_in ); if($ary_info === FALSE){ goto tagEND; } if(($ary_info[0] > 1000) || ($ary_info[1] > 1000)){ goto tagEND; } $image_type = $ary_info[2]; // 画像処理を選択 $func_create = NULL; $func_output = NULL; switch( $image_type ){ case IMAGETYPE_JPEG: $func_create = "imagecreatefromjpeg"; $func_output = "imagejpeg"; break; case IMAGETYPE_PNG: $func_create = "imagecreatefrompng"; $func_output = "imagepng"; break; default: break; } if($func_create === NULL){ goto tagEND; } // グレースケール画像に変換 $im_in = $func_create( $fpath_in ); conv_img_grayscale( $im_in, $im_out ); // ファイル出力 $fpath_out .= image_type_to_extension($image_type); $func_output( $im_out, $fpath_out); imagedestroy( $im_in ); imagedestroy( $im_out ); tagEND: } // 入力画像をグレースケール画像に変換 function conv_img_grayscale( $im_in, &$im_out ){ $img_w = imageSX($im_in); $img_h = imageSY($im_in); for($y = 0 ; $y < $img_h ; $y++){ for($x = 0 ; $x <$img_w ; $x++){ // 画素値を取得 $cRGB = imagecolorat($im_in, $x, $y); $cR = ($cRGB >> 16) & 0xFF; $cG = ($cRGB >> 8) & 0xFF; $cB = $cRGB & 0xFF; $g = round(($cR + $cG + $cB) / 3); // 画素値を作成 $gR = $g << 16; $gG = $g << 8; $gB = $g; $gRGB = $gR | $gG | $gB; imagesetpixel($im_in, $x, $y, $gRGB); imagecolorallocate($im_in, $g, $g, $g); } } // 作成したグレースケール画像を出力 $im_out = imagecreatetruecolor($img_w, $img_h); imagecopy($im_out, $im_in, 0, 0, 0, 0, $img_w, $img_h); } ?>
実行サンプルはこちらです。
http://www.dogrow.net/php/sample/00012/