サムネイル画像を出力し表示する平成30年 11月 17日 作成

00299

概略

写真等を多く配置するページにおいて、元画像の大きなサイズで配置させると表示に時間がかかるのでサムネイル画像にて対応する事が多いのだが、PHPで動的にサムネイルの作成する方法についての手段・方法を習得する。

動的にサムネイル画像を作成する事により、個別にサムネイル画像を作成等の手間を省き効率化も図りたい。

手段

HTMLのimgソースからphpファイルとして読み出す事で実現。


HTML記述例

<a href="#_"><img src="../../thumbnail?url=img/sample.jpg&wid=240" alt="" width="100%" height="100%" /></a>

サムネイル画像を出力するPHPを指定。

GETとし元画像のURLとサムネイル横幅を指定。

実装方法

PHP

<?php
	header('Content-Type: text/html; charset=utf-8');
	
	// urlと横幅取得及び簡易チェック
	$url = filter_input(INPUT_GET, "url");
		if(!preg_match("/^[一-龠a-zA-Z0-9-_\/.()]+$/", $url)){
			exit("urlエラー");
		}
	$wid = filter_input(INPUT_GET, "wid");
	if(!preg_match("/^[0-9]{2,4}$/", $wid)){
			exit("画像サイズエラー");
		}
	
	// 文字化けする場合
	// $url = mb_convert_encoding($url, "sjis", "utf-8");
	
	//「getimagesize()関数」:幅サイズ、縦サイズ、画像のタイプ、width="xxx",hegiht="yyy"の4つが返ってくる ここでは幅と縦だけを使うのでlist($width, $height)を左辺に入れる
	list($original_width, $original_height) = getimagesize($url);
	
	$thumb_width = $wid;
	// $wid(作成するサムネイル画像サイズ)とオリジナル画像サイズを比較し振り分け
	if($thumb_width < $original_width){
		// 比率より高さを算出
		$thumb_height = round($original_height * $thumb_width / $original_width);
	}
	else{
		// オリジナル画像の方が大きいので、オリジナル画像サイズで出力
		$thumb_width = $original_width;
		$thumb_height = $original_height;
	}
	
	/*
	高さが幅より大きい場合の横幅を高さに代入し抑制する手法
	$proportion = $original_width / $original_height;
	$thumb_height = round($thumb_width / $proportion);
	if($proportion < 1){
	    $thumb_height = $thumb_width;
	    $thumb_width = round($thumb_width * $proportion);
	}
	*/
	
	// サイズを指定し、背景用画像を生成
	$canvas = ImageCreateTrueColor($thumb_width, $thumb_height);
	
	// ファイル形式を判定するし出力を振り分け
	$mime_type = exif_imagetype($url);
	switch($mime_type){
		case "1":
			// PHPで画像を出力するときのヘッダー出力 コンテンツがgifであることをブラウザに知らせる
			header("content-type: image/gif");
			// 画像リソースを確保
			$image = ImageCreateFromGIF($url);
			
			// ▼ 透明を有効にする処理 ▼
			// 元画像から透過色を取得する
			$alpha = imagecolortransparent($image);
			// その色でキャンバスを塗りつぶす(左上 0, 0)
			imagefill($canvas, 0, 0, $alpha);
			// 塗りつぶした色を透過色として指定する
			imagecolortransparent($canvas, $alpha);
			// ▲ 透明を有効にする処理 ▲
			
			// $canvasに対し指定したサイズにて画像をコピーする
			ImageCopyResized($canvas, $image, 0, 0, 0, 0, $thumb_width, $thumb_height, $original_width, $original_height);
			// gifファイル出力  PHPのバージョン5.4からは第2引数空白厳禁
			imageGIF($canvas, NULL);
		break;
		case "2":
			header("content-type: image/jpeg");
			$image = ImageCreateFromJPEG($url);
			ImageCopyResized($canvas, $image, 0, 0, 0, 0, $thumb_width, $thumb_height, $original_width, $original_height);
			imageJPEG($canvas, NULL, 65);
		break;
		case "3":
			header("content-type: image/png");
			$image = ImageCreateFromPNG($url);
			
			// ▼ 透明を有効にする処理 ▼
			// アルファブレンディングをOFFにする
			imagealphablending($canvas, false);
			// 完全なアルファチャネル情報を保存するフラグをONにする
			imagesavealpha($canvas, true);
			// ▲ 透明を有効にする処理 ▲
        	
			ImageCopyResized($canvas, $image, 0, 0, 0, 0, $thumb_width, $thumb_height, $original_width, $original_height);
			imagePNG($canvas, NULL, 6);
		break;
		case "6":
			header("content-type: image/bmp");
			$image = ImageCreateFromBMP($url);
			ImageCopyResized($canvas, $image, 0, 0, 0, 0, $thumb_width, $thumb_height, $original_width, $original_height);
			imageBMP($canvas, NULL);
		break;
	}
	
	// メモリを開放
	imagedestroy($canvas);
	imagedestroy($image);
?>

考察

目標としていた事は達成できた。

圧縮比率の設定ができ利便性は高いと感じる。

最後までお読み下さり ありがとうございました。記事はここ迄です。

尚、本記事は作成から「5年以上」経過しています。

記事作成当時と現在の状況等により内容が適切でない場合があります。また、リンク切れが生じている場合もあります事を予めご了承下さい。

お気に入りに登録しますとお気に入り記事を一元管理でき、再度閲覧したい場合等 容易に記事を探し出す事ができますのでご活用下さい。

下段にはコメントを掲載しております。

広告バナー

コメント

頂いたコメントを下記に掲載しております。更に下部にはコメント投稿フォームを設けております。

注意事項を確認・了承した上、コメント投稿お願いいたします。

注意事項に該当するコメントにつきましては、事前告知なしに投稿したコメントの削除を行う場合があります。

予めご了承下さい。

  • 記事内容と無関係なコメント
  • 公序良俗に反するコメント
  • 個人情報や法令違反を含むコメント
  • その他、管理者が不適切と判断したコメント

現在 頂いているコメントはありません

返信先(コメント管理番号)コメントに対し返信する場合のみ
お名前・ハンドルネーム2~32文字内で入力下さい
メールアドレス公開される事はありません
電話番号半角数字+ハイフンで入力下さい
コメント全角500文字内で入力下さい