4,816 views
この記事は最終更新から 1163日 が経過しています。
やってみたいこと
任意のJPEG画像ファイルをWEBブラウザからアップロードし、白黒画像に変換してWEBブラウザに表示する。
ここでは ImageMagickなどの便利ライブラリを使わず、愚直に GDを使って画像を編集する。
↓
プログラム作成
プログラムの仕様は以下の通り。
・変換可能な画像形式は JPEG, PNGの2種類とする。
・一辺が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_change.php?fpath=tmp.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 convert_img($_GET['fpath']); // 画像変換&出力 function convert_img( $fpath ){ // 画像情報を取得 $ary_info = getimagesize( $fpath ); if($ary_info === FALSE){ goto tagEND; } $image_type = $ary_info[2]; // 画像処理を選択 $func_create = NULL; $func_display = NULL; switch( $image_type ){ case IMAGETYPE_JPEG: $func_create = imagecreatefromjpeg; $func_display = imagejpeg; break; case IMAGETYPE_PNG: $func_create = imagecreatefrompng; $func_display = imagepng; break; default: break; } if($func_create === NULL){ goto tagEND; } // 画像出力 $mime_type = image_type_to_mime_type( $image_type ); header("Content-Type: ".$mime_type); $im = $func_create( $fpath ); // グレースケール画像に変換 conv_img_grayscale( $im, $im_out ); $func_display( $im_out ); imagedestroy( $im ); 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); } ?>