ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
PHP : あとからギャラリー ( No.0 )
日時: 2009/07/12 14:45
名前: lightbox



画像が格納するディレクトリに置くと、簡単なギャラリーを作ってくれます。
というより、画像内容の確認と再利用に使うといいと思います。
サムネイルは、表示するたびに、GD で自動的に指定枚数まで作りますので、
何度か表示していると完成します。
※ 対象画像形式は、jpg と png です。gif は小さな部品である事が多いので外しました

対象ディレクトリに、サムネイル格納用の、s というディリクトリを前もって作成する必要があります
それ以外は、画像のあるディレクトリに置くだけです。
<?
// *********************************************************
// 共通部分
// *********************************************************
//require_once( 'lg_common.php' );
header( "Content-Type: text/html; Charset=shift_jis" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );
// 以下IE用
header( "P3P: CP=\"CAO PSA OUR\"" );

foreach( $_GET as $Key => $Value ) {
	$_POST[$Key] = $_GET[$Key];
}
foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = str_replace("\\\\", "\\", $Value );
	$_POST[$Key] = str_replace("\\'", "'", $_POST[$Key] );
	$_POST[$Key] = str_replace("\\\"", "\"", $_POST[$Key] );
}
foreach( $_COOKIE as $Key => $Value ) {
	$_COOKIE[$Key] = str_replace("\\\\", "\\", $Value );
	$_COOKIE[$Key] = str_replace("\\'", "'", $_COOKIE[$Key] );
	$_COOKIE[$Key] = str_replace("\\\"", "\"", $_COOKIE[$Key] );
}


if ( $_POST['p'] == '' ) {
	$_POST['p'] = 1;
}

// *********************************************************
// 変数
// *********************************************************
// 対象となるディレクトリ
$upload_dir = '.';
// 一行の列数
$cols = 8;
// サムネイルが無い場合に作成する最大数
$creates = 20;
// 行数
$rowmax = 5;


// テーブルタグを含むファイル名リストの文字列
$upload_list = '';
$scnt = 0;
$rowcnt = 0;
$pagecnt = 1;
$pagefmt = "";
$file_cnt = 0;
$txt_style = 'cursor:pointer;width:100px;overflow:hidden';

////////////////////////////////////////////////////////////
// 常に実行するファイル一覧の取得
////////////////////////////////////////////////////////////
$DirHandle = @opendir($upload_dir);
if ( $DirHandle ) {

	if ( $_POST['p'] != $pagecnt ) {
		$wk = $_POST['p']-1;
		$pagefmt = " <a href=\"{$_SERVER['PHP_SELF']}?p=$wk\">&lt;</a> <a href=\"{$_SERVER['PHP_SELF']}?p=$pagecnt\">$pagecnt</a>";
	}
	else {
		$pagefmt = " $pagecnt";
	}

	$page_list .= " $pagefmt";

	// ループ処理
	while( 1 ) {

		if ( $_POST['p'] != $pagecnt ) {
			while( 1 ) {
				$rows = ReadRow( $DirHandle, $cols );
				if ( count( $rows ) == 0 ) {
					$pagecnt++;

					if ( $_POST['p'] != $pagecnt ) {
						$pagefmt = " <a href=\"{$_SERVER['PHP_SELF']}?p=$pagecnt\">$pagecnt</a>";
					}
					else {
						$pagefmt = " $pagecnt";
					}

					$page_list .= " $pagefmt";
					break;
				}

				$rowcnt++;

				if ( $rowcnt > $rowmax ) {
					$pagecnt++;

					if ( $_POST['p'] != $pagecnt ) {
						$pagefmt = " <a href=\"{$_SERVER['PHP_SELF']}?p=$pagecnt\">$pagecnt</a>";
					}
					else {
						$pagefmt = " $pagecnt";
					}

					$page_list .= " $pagefmt";
					$rowcnt = 1;
				}

				if ( $_POST['p'] == $pagecnt ) {
					$rowcnt = 0;
					break;
				}

				$file_cnt += count($rows);
			}
		}
		else {
			$rows = ReadRow( $DirHandle, $cols );
		}

		// 配列が空の場合はデータが全く存在しないので、
		// 何もしないですぐ終わる
		if ( count( $rows ) == 0 ) {
			$rowcnt = 0;
			break;
		}

		$rowcnt++;
		$file_cnt += count($rows);
		if ( $rowcnt > $rowmax ) {
			break;
		}

		$upload_list .= "<tr>\n";
		for( $i = 0; $i < $cols; $i++ ) {

			$upload_list .= "<td valign=top>";
			if ( $rows[$i] != '' ) {
				$upload_list .= "<a href=\"$upload_dir/{$rows[$i]}\"";

				// サムネイルが無い場合、$creates の値まで作成
				$fname = explode( ".", $rows[$i] );
				$chk = file_exists( "$upload_dir/s/{$fname[0]}.jpg" );

				if ( !$chk ) {
					$aExt = explode( ".", $rows[$i] );
					if ( strtoupper( $aExt[1] ) == 'JPG' || 
							strtoupper( $aExt[1] ) == 'JPEG' ) {
						$scnt++;
						if ( $scnt <= $creates ) {
							$ret = ImageConvert( $upload_dir, $rows[$i], 0 );
						}
					}
					if ( strtoupper( $aExt[1] ) == 'PNG' ) {
						$scnt++;
						if ( $scnt <= $creates ) {
							$ret = ImageConvert( $upload_dir, $rows[$i], 1 );
						}
					}
				}

				if ( $ret === false ) {
					$scnt--;
					$upload_list .= " target=\"_blank\"><div style='$txt_style'>{$rows[$i]}</div></a>";
					$ret = true;
				}
				else {
					// サムネイルがある場合は、IMG を埋め込む
					if ( $chk ) {
						$upload_list .= " target=\"_blank\">";
						$style = "style='border:1 #000000 solid'";
						$upload_list .= "<img $style src=\"$upload_dir/s/{$fname[0]}.jpg\">";
						$upload_list .= "</a>";
					}
					else {
						$upload_list .= " target=\"_blank\"><div style='$txt_style'>{$rows[$i]}</div></a>";
					}
				}
			}
			$upload_list .= "</td>\n";
		}
		$upload_list .= "</tr>\n";

	}

	if ( $rowcnt > $rowmax ) {
		$rowcnt = 1;
		while( 1 ) {

			$rows = ReadRow( $DirHandle, $cols );
			if ( count( $rows ) == 0 ) {
				$pagecnt++;

				if ( $_POST['p'] != $pagecnt ) {
					$wk = $_POST['p']+1;
					$pagefmt = " <a href=\"{$_SERVER['PHP_SELF']}?p=$pagecnt\">$pagecnt</a> <a href=\"{$_SERVER['PHP_SELF']}?p=$wk\">&gt;</a>";
				}
				else {
					$pagefmt = " $pagecnt";
				}

				$page_list .= " $pagefmt";
				break;
			}

			$rowcnt++;
			$file_cnt += count($rows);

			if ( $rowcnt > $rowmax ) {
				$pagecnt++;

				if ( $_POST['p'] != $pagecnt ) {
					$pagefmt = " <a href=\"{$_SERVER['PHP_SELF']}?p=$pagecnt\">$pagecnt</a>";
				}
				else {
					$pagefmt = " $pagecnt";
				}

				$page_list .= " $pagefmt";
				$rowcnt = 1;
			}
		}


	}

}


// *********************************************************
// 一行のデータを読んで、配列にデータをセットする
// ( 戻り値の配列数が 0 の場合、データは存在しない )
// $cols で、1行の列数を決定する
// *********************************************************
function ReadRow( $handle, $cols ) {

	$ret = array();

	while( 1 ) {
		$Target = readdir( $handle );
		// データが完全な終了
		if ( $Target === false ) {
			break;
		}
		// 対象外は読み飛ばし
		if ( $Target == '.' || $Target == '..' ) {
			continue;
		}
		if ( is_dir($Target) ) {
			continue;
		}


		$aExt = explode( ".", $Target );
		if ( count( $aExt ) == 2 ) {
			if ( strtoupper( $aExt[1] ) == 'JPG' || 
					strtoupper( $aExt[1] ) == 'JPEG' ) {
				$ret[] = $Target;
			}
			if ( strtoupper( $aExt[1] ) == 'PNG' ) {
				$ret[] = $Target;
			}
		}

		// 指定回数配列がセットされたらループを終了する
		if ( count( $ret ) == $cols ) {
			break;
		}
	}

	return $ret;
}

# **********************************************************
# アップロードされたファイルを縮小して保存
# **********************************************************
function ImageConvert( $dir, $filename, $type ) {

	global $err_message;

	# ファイルの属性等を取得
	$target	= getimagesize( "$dir/$filename" );
 
	# 現在のサイズ
	$width	= $target[0];
	$height	= $target[1];

	$width_new	= 100;	// 幅固定
	$height_new = (int)( ($height/$width)*$width_new );
 
	# 元のファイルのハンドル
	if ( $type == 0 ) {
		$jpeg		= @imagecreatefromjpeg ( "$dir/$filename" );
	}
	if ( $type == 1 ) {
		$jpeg		= @imagecreatefrompng ( "$dir/$filename" );
	}
	if ( $jpeg === false ) {
		return false;
	}
	# 新しいイメージ
	$jpeg_new	= @imagecreatetruecolor( $width_new, $height_new );
	if ( $jpeg_new === false ) {
		return false;
	}

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

	if ( !$ret ) {
		$err_message = "サイズ変更に失敗しました";
		return false;
	}

	# JPEG ファイルとして、クオリティ 75 で出力
	$fname = explode( ".", $filename );
	$ret = @imagejpeg ( $jpeg_new, "$dir/s/{$fname[0]}.jpg", 75 );
	if ( !$ret ) {
		$err_message = "ファイル作成に失敗しました";
		return false;
	}

	return true;
}

// *********************************************************
// 画面
// *********************************************************
//require_once( 'lg_view.php' );

?>
<html>
<head>
<title>lightbox gallery</title>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />

</head>
<body>

<?= $page_list ?>&nbsp;&nbsp;&nbsp;&nbsp;( ファイル数 : <?= $file_cnt ?> )
<table>
<?= $upload_list ?>
</table>

</body>
</html>