(9) GDでアップロード画像を白黒画像に変換

投稿者: | 2016年10月23日

4,816 views

この記事は最終更新から 1163日 が経過しています。

やってみたいこと

任意のJPEG画像ファイルをWEBブラウザからアップロードし、白黒画像に変換してWEBブラウザに表示する。
ここでは ImageMagickなどの便利ライブラリを使わず、愚直に GDを使って画像を編集する。

sample_c
 ↓
sample_g

プログラム作成

プログラムの仕様は以下の通り。
・変換可能な画像形式は 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);
}
?>

 


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)