2 && $var_array[2] != '')
{
$pic = $var_array[2];
$mode = "single";
}
// directory locations relative to this script (not URL)
$pics_dir = "photo";
$thumbs_dir = "photo/thumbs";
//dimensions of thumbnails
$thumb_width = 144;
$thumb_height = 96;
$ext_pattern = ".+\.png$|.+\.jpg$|.+\.avi$|.+\.wmv$|.+\.mpg$|.+\.mpeg$|.+\.mov$";
$ffmpeg_path = "/usr/bin/ffmpeg";
function create_image_thumbnail($input_path, $output_path, $thumb_width, $thumb_height)
{
// get attributes of the original image
list($width,$height,$pictype) = getimagesize($input_path);
// read in the original image
switch ($pictype) {
case 1 : $img = imagecreatefromgif($input_path); break;
case 2 : $img = imagecreatefromjpeg($input_path); break;
case 3 : $img = imagecreatefrompng($input_path); break;
}
// maintain the aspect ratio of the image
$new_width = $thumb_width;
if ($width > $height) {
$new_height = $height * ($new_width/$width);
} else {
$new_height = $new_width;
$new_width = $width * ($new_height/$height);
}
// allocate memory for thumbnail image
$thumbnail = imagecreatetruecolor($new_width, $new_height);
// copy the original image into the thumbnail by resizing it
fastimagecopyresampled($thumbnail, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height, 4);
// save thumbnail to file
switch ($pictype) {
case 1 : imagegif($thumbnail, $output_path); break;
case 2 : imagejpeg($thumbnail, $output_path); break;
case 3 : imagepng($thumbnail, $output_path); break;
}
return $thumbnail;
}
function create_video_thumbnail($input_path, $thumb_path, $thumb_width, $thumb_height)
{
$cmd = "/usr/bin/ffmpeg -i $input_path -ss 00:00:05 -t 00:00:1 -s $thumb_width"."x"."$thumb_height -r 1 -f mjpeg $output_path";
exec($cmd);
// overlay video icon
$insert = imagecreatefromgif('video_icon.gif');
$background = imagecreatefromjpeg($output_path);
$insert_x = imagesx($insert);
$insert_y = imagesy($insert);
$background_x = imagesx($background);
$background_y = imagesy($background);
imagecopymerge($background,$insert,$background_x-$insert_x,$background_y-$insert_y,0,0,$insert_x,$insert_y,100);
imagejpeg($background,$output_path);
}
function read_directory($data_dir, $ext)
{
$dir_handle = @opendir($data_dir);
if ($dir_handle)
{
while ($file = readdir($dir_handle))
if (eregi($ext,$file))
$files[] = $file;
closedir($dir_handle);
}
if (gettype($files) == "array")
sort($files);
else
$files = false;
return $files;
}
function index_print($album,$pics_dir,$thumbs_dir,$ext,$w,$h)
{
$images = read_directory($pics_dir."/".$album,$ext);
if (!$images)
return "No files in $pics_dir/$album";
// if directory for thumbnails does not exist, create it
if (!file_exists("$thumbs_dir/$album"))
mkdir("$thumbs_dir/$album", 0777);
$selflink = rtrim($_SERVER["PHP_SELF"], '/');
$html = '
';
while (list($key, $image) = each($images))
{
$input_path = "$pics_dir/$album/$image";
$thumb_path = "$thumbs_dir/$album/$image";
// different handling depending on whether it is an image or a video
$type = end(explode(".", $image));
if (!strcasecmp($type, "png") || !strcasecmp($type, "jpg") || !strcasecmp($type, "gif"))
{
if (!file_exists($thumb_path))
create_image_thumbnail($input_path, $thumb_path, $w, $h);
}
else // must be video
{
$thumb_path .= ".jpg";
if (!file_exists($thumb_path))
create_video_thumbnail($input_path, $thumbs_path, $w, $h);
}
$html .= "\r\n\t

";
}
$html .= "\r\n
\r\n";
return $html;
}
function image_print($album, $pic, $pics_dir, $ext)
{
// find the next and previous images
$image_arr = read_directory("$pics_dir/$album", $ext);
$prev = '.';
$next = '.';
// find this image in directory listing and capture previous and next
// images
for ($i = 0; $i < sizeof($image_arr); $i++)
{
if ($image_arr[$i] == $pic)
{
if ($i != 0)
$prev = $image_arr[$i-1];
if ($i != (sizeof($image_arr)-1))
$next = $image_arr[$i+1];
break;
}
}
// print out the HTML
$src = "$pics_dir/$album/$pic";
list(,,,$sizestr) = getimagesize($src);
$html = "\r\n";
// print the navigation
$html .= "
previous |
index |
next ";
// extract the location and caption if present
$size = GetImageSize ($src,$info);
list($width, $height) = $size;
if (isset($info["APP13"]))
{
$iptc = iptcparse ($info["APP13"]);
$location = $iptc["2#090"][0] . ', ' . $iptc["2#101"][0];
$caption = $iptc["2#005"][0];
}
$html .= "\r\n

";
// print the photo
$html .= "\r\n
";
$html .= '';
if (isset($caption))
$html .= "$caption ";
if (isset($location))
$html .= $location;
$html .= ' | ';
// print the EXIF data (ISO, f-stop etc)
$exif = exif_read_data ($src,0,true);
if (($exif != false) && (isset($exif['EXIF'])))
{
$html .= $exif['EXIF']['DateTimeOriginal'];
$html .= " ISO ";
$html .= $exif['EXIF']['ISOSpeedRatings'];
$html .= ", ";
$html .= $exif['EXIF']['ExposureTime'];
$html .= " sec, f/";
$pieces = explode("/", $exif['EXIF']['FNumber']);
$html .= $pieces[0]/$pieces[1];
$html .= " @ ";
$pieces = explode("/", $exif['EXIF']['FocalLength']);
$html .= $pieces[0]/$pieces[1];
$html .= " mm";
}
$html .= " |
\r\n
";
$html .= '
';
return $html;
}
function fastimagecopyresampled (&$dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h, $quality = 3)
{
// Plug-and-Play fastimagecopyresampled function replaces much slower imagecopyresampled.
// Just include this function and change all "imagecopyresampled" references to "fastimagecopyresampled".
// Typically from 30 to 60 times faster when reducing high resolution images down to thumbnail size using the default quality setting.
// Author: Tim Eckel - Date: 12/17/04 - Project: FreeRingers.net - Freely distributable.
//
// Optional "quality" parameter (defaults is 3). Fractional values are allowed, for example 1.5.
// 1 = Up to 600 times faster. Poor results, just uses imagecopyresized but removes black edges.
// 2 = Up to 95 times faster. Images may appear too sharp, some people may prefer it.
// 3 = Up to 60 times faster. Will give high quality smooth results very close to imagecopyresampled.
// 4 = Up to 25 times faster. Almost identical to imagecopyresampled for most images.
// 5 = No speedup. Just uses imagecopyresampled, highest quality but no advantage over imagecopyresampled.
if (empty($src_image) || empty($dst_image)) {
return false;
}
if ($quality <= 1) {
$temp = imagecreatetruecolor ($dst_w + 1, $dst_h + 1);
imagecopyresized ($temp, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w + 1, $dst_h + 1, $src_w, $src_h);
imagecopyresized ($dst_image, $temp, 0, 0, 0, 0, $dst_w, $dst_h, $dst_w, $dst_h);
imagedestroy ($temp);
} elseif ($quality < 5 && (($dst_w * $quality) < $src_w || ($dst_h * $quality) < $src_h)) {
$tmp_w = $dst_w * $quality;
$tmp_h = $dst_h * $quality;
$temp = imagecreatetruecolor ($tmp_w + 1, $tmp_h + 1);
imagecopyresized ($temp, $src_image, $dst_x * $quality, $dst_y * $quality, $src_x, $src_y, $tmp_w + 1, $tmp_h + 1, $src_w, $src_h);
imagecopyresampled ($dst_image, $temp, 0, 0, 0, 0, $dst_w, $dst_h, $tmp_w, $tmp_h);
imagedestroy ($temp);
} else {
imagecopyresampled ($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
}
return true;
}
function main($mode,$album,$pic,$pics_dir,$thumbs_dir,$w,$h,$ext=".jpg")
{
if (file_exists("$pics_dir/$album/title.txt"))
$album_name = rtrim(file_get_contents("$pics_dir/$album/title.txt"));
else {
$album_name = '';
$tokens = explode('-', $album);
foreach ($tokens as $token)
$album_name .= ucwords($token) . ' ';
}
$page_title = 'Photo Album: ' . $album_name;
$page_description = 'Photos from the album - '.$album_name;
$crumbs['Photos'] = '/photos/';
$crumbs[$album_name] = null;
switch ($mode) {
case "single" :
$page_title .= " ($pic)";
$hide_rightmenu = true;
$crumbs[$album_name] = '/photos/'.$album;
$crumbs[$pic] = null;
include('header.inc');
echo image_print($album,$pic,$pics_dir,$ext);
break;
default :
include('header.inc');
echo "$page_title
\r\n";
echo index_print($album,$pics_dir,$thumbs_dir,$ext,$w,$h);
}
include('footer.inc');
}
main($mode,$album,$pic,$pics_dir,$thumbs_dir,$thumb_width,$thumb_height,$ext_pattern);
?>