5,273 views
この記事は最終更新から 1460日 が経過しています。
やってみたいこと
任意の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);
}
?>
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2025-12-09: 0回 2025-12-08: 5回 2025-12-07: 0回 2025-12-06: 0回 2025-12-05: 0回 2025-12-04: 0回 2025-12-03: 1回