SQLの窓 イラストAC フリー素材

2019年08月25日

PHP : 画像を返す処理( readfile ) と画像を縮小する処理( GD )

この PHP を指定ファイル名で呼び出すと、幅を 100px で縮小された画像を返します( 無ければ縮小画像を返します )。

▼ 縮小
imagecopyresampled
<?php
$debug = false;

// *************************************
// 画像があるフォルダの相対パス
// *************************************
$image_dir = 'images';

// *************************************
// QueryString より対象の
// 画像ファイル名を取得
// *************************************
$file = "{$image_dir}/{$_GET['name']}";

// *************************************
// 画像が存在しない場合は、
// エラー用の画像をブラウザに返す
// *************************************
if ( !file_exists( $file ) || $_GET['name'] == '' ) {
	header("Content-Type: image/png");
	$file = "{$image_dir}/error.png";
	header('Content-Length: ' . filesize($file));
	readfile($file);
	exit();
}

// *************************************
// ファイルの MIME を取得
// *************************************
$mime = image_type_to_mime_type( exif_imagetype( $file ) );

// *************************************
// ファイル名から拡張子を除いた部分を
// 取得して、縮小ファイルのファイルの
// パスを作成する( .jpg )
// *************************************
$path_parts = pathinfo($_GET['name']);
$small_file = "{$image_dir}/s/{$path_parts['filename']}.jpg";

// *************************************
// 縮小ファイルがなければ作成して
// ブラウザに返す、あればそのまま返す
// *************************************
if ( !file_exists( $small_file ) ) {
	if ( ImageConvert( $image_dir, $_GET['name'], exif_imagetype( $file ) ) ) {
		header("Content-Type: image/jpeg");
		header('Content-Length: ' . filesize($small_file));
		readfile($small_file);
	}
	else {
		// 縮小に失敗した場合は、大きい元のファイルを返す
		header("Content-Type: {$mime}");
		header('Content-Length: ' . filesize($file));
		readfile($file);
	}
}
else {
	header("Content-Type: image/jpeg");
	header('Content-Length: ' . filesize($small_file));
	readfile($small_file);
}

// *************************************
// ファイルを縮小して保存
// *************************************
function ImageConvert( $dir, $filename, $type ) {

log_print( "$dir, $filename, $type" );

	// *************************************
	// ファイルの属性等を取得
	// *************************************
	$target	= getimagesize( "$dir/$filename" );

log_print( print_r($target,true) );
 
	// 現在のサイズ
	$width	= $target[0];
	$height	= $target[1];

	$width_new	= 100;	// 幅固定

	// *************************************
	// 縮小後の高さを計算で求める
	// *************************************
	$height_new = (int)( ($height/$width)*$width_new );

	$target_path = "$dir/$filename";

	$jpeg = false;

	// *************************************
	// 画像の種類によって、オブジェクト作成方法を選択する
	// *************************************
	if ( $type == 2 ) {
		$jpeg = @imagecreatefromjpeg( $target_path );
	}
	if ( $type == 3 ) {
		$jpeg = @imagecreatefrompng( $target_path );
	}
	if ( $type == 4 ) {
		$jpeg = @imagecreatefromgif( $target_path );
	}
	if ( $jpeg === false ) {
		return false;
	}

log_print( "現画像取得" );

	// *************************************
	// 新しい空のイメージ
	// *************************************
	$jpeg_new = @imagecreatetruecolor( $width_new, $height_new );
	if ( $jpeg_new === false ) {
		return false;
	}

log_print( "新しい画像取得" );

	// *************************************
	// サイズ変更して新しいイメージへ転送
	// *************************************
	$ret = @imagecopyresampled(
		$jpeg_new,
		$jpeg,
		0,
		0,
		0,
		0,
		$width_new,
		$height_new,
		$width,
		$height
	);

	if ( !$ret ) {
		return false;
	}

log_print( "縮小完了" );

	// *************************************
	// JPEG ファイルとして、
	// クオリティ 75 で出力
	// *************************************
	$path_parts = pathinfo($filename);
	$ret = @imagejpeg ( $jpeg_new, "$dir/s/{$path_parts['filename']}.jpg", 75 );
	if ( !$ret ) {
		return false;
	}

log_print( "ファイル出力完了:$dir/s/{$path_parts['filename']}.jpg" );

	return true;
}


// *************************************
// デバッグログ
// *************************************
function log_print( $msg ) {

	if ( !$GLOBALS['debug'] ) {
		return false;
	}

	file_put_contents("debug.log", $msg ,FILE_APPEND );
	file_put_contents("debug.log", "\n" ,FILE_APPEND );

}


?>





【PHPの最新記事】
posted by at 2019-08-25 22:06 | PHP | このブログの読者になる | 更新情報をチェックする