/* set application name and version information */
$this->cfg->product = "phpfspot";
- $this->cfg->version = "1.4";
+ $this->cfg->version = "1.5";
$this->sort_orders= array(
'date_asc' => 'Date ↑',
return;
}
- $orig_path = $this->translate_path($this->parse_uri($details['uri']));
+ $orig_path = $this->translate_path($this->parse_uri($details['uri'], 'fullpath'));
$thumb_path = $this->get_thumb_path($this->cfg->photo_width, $photo);
if(!file_exists($orig_path)) {
* session-variable $_SESSION['selected_tags']
* @return string
*/
- public function getSelectedTags()
+ public function getSelectedTags($type = 'link')
{
/* retrive tags from database */
$this->get_tags();
{
// return all selected tags
if(isset($_SESSION['selected_tags']) && in_array($tag, $_SESSION['selected_tags'])) {
- $output.= "<a href=\"javascript:Tags('del', ". $tag .");\" class=\"tag\">". $this->tags[$tag] ."</a>, ";
+
+ switch($type) {
+ default:
+ case 'link':
+ $output.= "<a href=\"javascript:Tags('del', ". $tag .");\" class=\"tag\">". $this->tags[$tag] ."</a>, ";
+ break;
+ case 'img':
+ $output.= "
+ <div style=\"display: table-cell;\">
+ <div style=\"display: table-row; text-align: center;\">
+ <a href=\"javascript:Tags('del', ". $tag .");\" title=\"". $this->tags[$tag] ."\">
+ <img src=\"phpfspot_img.php?tagidx=". $tag ."\" />
+ </a>
+ </div>
+ <div style=\"display: table-row; text-align: center;\">
+ <a href=\"javascript:Tags('del', ". $tag .");\" title=\"". $this->tags[$tag] ."\">
+ <img src=\"resources/underbar.png\" />
+ </a>
+ </div>
+ </div>
+ ";
+ break;
+ }
}
}
if(isset($_SESSION['searchfor_tag']))
unset($_SESSION['searchfor_tag']);
+ // has the user requested to hide this tag, and still someone,
+ // somehow tries to add it, don't allow this.
+ if(!isset($this->cfg->hide_tags) &&
+ in_array($this->get_tag_name($tag), $this->cfg->hide_tags))
+ return "ok";
+
if(!in_array($tag, $_SESSION['selected_tags']))
array_push($_SESSION['selected_tags'], $tag);
-
return "ok";
} // addTag()
$this->tmpl->assign('img_fullname', $img_fullname);
$this->tmpl->assign('img_title', $img_title);
$this->tmpl->assign('thumbs', $thumbs);
+ $this->tmpl->assign('selected_tags', $this->getSelectedTags('img'));
$this->tmpl->show("photo_index.tpl");
} // showCredits()
/**
- * create_thumbnails for the requested width
+ * create thumbnails for the requested width
*
* this function creates image thumbnails of $orig_image
* stored as $thumb_image. It will check if the image is
return false;
}
- $details = getimagesize($orig_image);
-
+ $mime = $this->get_mime_info($orig_image);
+
/* check if original photo is a support image type */
- if(!$this->checkifImageSupported($details['mime']))
+ if(!$this->checkifImageSupported($mime))
return false;
- switch($details['mime']) {
+ switch($mime) {
case 'image/jpeg':
}
$src_img = @imagecreatefromjpeg($orig_image);
+ $handler = "gd";
break;
case 'image/png':
$src_img = @imagecreatefrompng($orig_image);
+ $handler = "gd";
+ break;
+
+ case 'image/x-portable-pixmap':
+
+ $src_img = new Imagick($orig_image);
+ $handler = "imagick";
break;
}
- if(!$src_img) {
+ if(!isset($src_img) || empty($src_img)) {
print "Can't load image from ". $orig_image ."\n";
return false;
}
- /* grabs the height and width */
- $cur_width = imagesx($src_img);
- $cur_height = imagesy($src_img);
+ switch($handler) {
+
+ case 'gd':
+
+ /* grabs the height and width */
+ $cur_width = imagesx($src_img);
+ $cur_height = imagesy($src_img);
+
+ // If requested width is more then the actual image width,
+ // do not generate a thumbnail, instead safe the original
+ // as thumbnail but with lower quality. But if the image
+ // is to heigh too, then we still have to resize it.
+ if($width >= $cur_width && $cur_height < $this->cfg->thumb_height) {
+ $result = imagejpeg($src_img, $thumb_image, 75);
+ imagedestroy($src_img);
+ return true;
+ }
+ break;
+
+ case 'imagick':
+
+ $cur_width = $src_img->getImageWidth();
+ $cur_height = $src_img->getImageHeight();
+
+ // If requested width is more then the actual image width,
+ // do not generate a thumbnail, instead safe the original
+ // as thumbnail but with lower quality. But if the image
+ // is to heigh too, then we still have to resize it.
+ if($width >= $cur_width && $cur_height < $this->cfg->thumb_height) {
+ $src_img->setCompressionQuality(75);
+ $src_img->setImageFormat('jpeg');
+ $src_img->writeImage($thumb_image);
+ $src_img->clear();
+ $src_img->destroy();
+ return true;
+ }
+ break;
- // If requested width is more then the actual image width,
- // do not generate a thumbnail, instead safe the original
- // as thumbnail but with lower quality. But if the image
- // is to heigh too, then we still have to resize it.
- if($width >= $cur_width && $cur_height < $this->cfg->thumb_height) {
- $result = imagejpeg($src_img, $thumb_image, 75);
- imagedestroy($src_img);
- return true;
}
// If the image will be rotate because EXIF orientation said so
}
}
- /* creates new image of that size */
- $dst_img = imagecreatetruecolor($new_w, $new_h);
+ switch($handler) {
- imagefill($dst_img, 0, 0, ImageColorAllocate($dst_img, 255, 255, 255));
+ case 'gd':
- /* copies resized portion of original image into new image */
- imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $new_w, $new_h, imagesx($src_img), imagesy($src_img));
+ /* creates new image of that size */
+ $dst_img = imagecreatetruecolor($new_w, $new_h);
- /* needs the image to be flipped horizontal? */
- if($flip_hori) {
- $this->_debug("(FLIP)");
- $dst_img = $this->flipImage($dst_img, 'hori');
- }
- /* needs the image to be flipped vertical? */
- if($flip_vert) {
- $this->_debug("(FLIP)");
- $dst_img = $this->flipImage($dst_img, 'vert');
- }
+ imagefill($dst_img, 0, 0, ImageColorAllocate($dst_img, 255, 255, 255));
- if($rotate) {
- $this->_debug("(ROTATE)");
- $dst_img = $this->rotateImage($dst_img, $rotate);
- }
+ /* copies resized portion of original image into new image */
+ imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $new_w, $new_h, imagesx($src_img), imagesy($src_img));
- /* write down new generated file */
- $result = imagejpeg($dst_img, $thumb_image, 75);
+ /* needs the image to be flipped horizontal? */
+ if($flip_hori) {
+ $this->_debug("(FLIP)");
+ $dst_img = $this->flipImage($dst_img, 'hori');
+ }
+ /* needs the image to be flipped vertical? */
+ if($flip_vert) {
+ $this->_debug("(FLIP)");
+ $dst_img = $this->flipImage($dst_img, 'vert');
+ }
- /* free your mind */
- imagedestroy($dst_img);
- imagedestroy($src_img);
+ if($rotate) {
+ $this->_debug("(ROTATE)");
+ $dst_img = $this->rotateImage($dst_img, $rotate);
+ }
- if($result === false) {
- print "Can't write thumbnail ". $thumb_image ."\n";
- return false;
- }
+ /* write down new generated file */
+ $result = imagejpeg($dst_img, $thumb_image, 75);
- return true;
+ /* free your mind */
+ imagedestroy($dst_img);
+ imagedestroy($src_img);
+
+ if($result === false) {
+ print "Can't write thumbnail ". $thumb_image ."\n";
+ return false;
+ }
+
+ return true;
+
+ break;
+
+ case 'imagick':
+
+ $src_img->resizeImage($new_w, $new_h, Imagick::FILTER_LANCZOS, 1);
+
+ /* needs the image to be flipped horizontal? */
+ if($flip_hori) {
+ $this->_debug("(FLIP)");
+ $src_img->rotateImage(new ImagickPixel(), 90);
+ $src_img->flipImage();
+ $src_img->rotateImage(new ImagickPixel(), -90);
+ }
+ /* needs the image to be flipped vertical? */
+ if($flip_vert) {
+ $this->_debug("(FLIP)");
+ $src_img->flipImage();
+ }
+
+ if($rotate) {
+ $this->_debug("(ROTATE)");
+ $src_img->rotateImage(new ImagickPixel(), $rotate);
+ }
+
+ $src_img->setCompressionQuality(75);
+ $src_img->setImageFormat('jpeg');
+
+ if(!$src_img->writeImage($thumb_image)) {
+ print "Can't write thumbnail ". $thumb_image ."\n";
+ return false;
+ }
+
+ $src_img->clear();
+ $src_img->destroy();
+ return true;
+
+ break;
+
+ }
} // create_thumbnail()
*/
public function get_meta_informations($file)
{
- return exif_read_data($file);
+ return @exif_read_data($file);
} // get_meta_informations()
$this->cfg->thumb_width,
$this->cfg->photo_width,
$this->cfg->mini_width,
+ 30,
);
/* get details from F-Spot's database */
$details = $this->get_photo_details($idx);
/* calculate file MD5 sum */
- $full_path = $this->translate_path($this->parse_uri($details['uri']));
+ $full_path = $this->translate_path($this->parse_uri($details['uri'], 'fullpath'));
if(!file_exists($full_path)) {
$this->_error("File ". $full_path ." does not exist\n");
return;
}
- $file_md5 = md5_file($full_path);
-
$this->_debug("Image [". $idx ."] ". $this->shrink_text($this->parse_uri($details['uri'], 'filename'), 20) ." Thumbnails:");
+ /* If Nikon NEF format, we need to treat it another way */
+ if(isset($this->cfg->dcraw_bin) &&
+ file_exists($this->cfg->dcraw_bin) &&
+ is_executable($this->cfg->dcraw_bin) &&
+ preg_match('/\.nef$/i', $details['uri'])) {
+
+ $ppm_path = preg_replace('/\.nef$/i', '.ppm', $full_path);
+
+ /* if PPM file does not exist, let dcraw convert it from NEF */
+ if(!file_exists($ppm_path)) {
+ system($this->cfg->dcraw_bin ." -a ". $full_path);
+ }
+
+ /* for now we handle the PPM instead of the NEF */
+ $full_path = $ppm_path;
+
+ }
+
+ $file_md5 = md5_file($full_path);
$changes = false;
foreach($resolutions as $resolution) {
$tags = Array();
- while($row = $this->db->db_fetch_object($result))
+ while($row = $this->db->db_fetch_object($result)) {
+ if(isset($this->cfg->hide_tags) && in_array($row['name'], $this->cfg->hide_tags))
+ continue;
$tags[$row['id']] = $row['name'];
+ }
return $tags;
*/
public function checkifImageSupported($mime)
{
- if(in_array($mime, Array("image/jpeg", "image/png")))
+ $supported_types = Array(
+ "image/jpeg",
+ "image/png",
+ "image/x-portable-pixmap",
+ "image/tiff"
+ );
+
+ if(in_array($mime, $supported_types))
return true;
return false;
<br>
". $details['description']);
- $orig_path = $this->translate_path($this->parse_uri($details['uri']));
+ $orig_path = $this->translate_path($this->parse_uri($details['uri'], 'fullpath'));
/* get EXIF information if JPEG */
if($details['mime'] == "image/jpeg") {
{
$all = Array();
- $result = $this->db->db_query("
- SELECT id
- FROM photos
- ");
-
+ $query_str = "
+ SELECT p.id
+ FROM photos p
+ ";
+
+ /* if show_tags is set, only return details for photos which
+ are specified to be shown
+ */
+ if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
+ $query_str.= "
+ INNER JOIN photo_tags pt
+ ON p.id=pt.photo_id
+ INNER JOIN tags t
+ ON pt.tag_id=t.id
+ WHERE
+ t.name IN ('".implode("','",$this->cfg->show_tags)."')";
+ }
+
+ $result = $this->db->db_query($query_str);
+
while($row = $this->db->db_fetch_object($result)) {
array_push($all, $row['id']);
}
} // get_random_photo()
+ /**
+ * get random photo tag photo
+ *
+ * this function will get all photos tagged with the requested
+ * tag from the fspot database and randomly return ONE entry
+ *
+ * saddly there is yet no sqlite3 function which returns
+ * the bulk result in array, so we have to fill up our
+ * own here.
+ * @return array
+ */
+ public function get_random_tag_photo($tagidx)
+ {
+ $all = Array();
+
+ $query_str = "
+ SELECT p.id
+ FROM photos p
+ INNER JOIN photo_tags pt
+ ON p.id=pt.photo_id
+ ";
+
+ if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
+ $query_str.= "
+ INNER JOIN tags t
+ ON pt.tag_id=t.id
+ ";
+ }
+ $query_str.= "
+ WHERE
+ pt.tag_id LIKE '". $tagidx ."'
+ ";
+
+ /*if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
+ $query_str.= "
+ AND
+ t.name IN ('".implode("','",$this->cfg->show_tags)."')
+ ";
+ }*/
+
+ $result = $this->db->db_query($query_str);
+
+ while($row = $this->db->db_fetch_object($result)) {
+ array_push($all, $row['id']);
+ }
+
+ return $all[array_rand($all)];
+
+ } // get_random_tag_photo()
+
/**
* validates provided date
*
} // getCurrentPage()
+ /**
+ * return mime info
+ *
+ * this function tries to find out the correct mime-type
+ * for the provided file.
+ * @param string $file
+ * @return string
+ */
+ public function get_mime_info($file)
+ {
+ $details = getimagesize($file);
+
+ /* if getimagesize() returns empty, try at least to find out the
+ mime type.
+ */
+ if(empty($details) && function_exists('mime_content_type')) {
+
+ // mime_content_type is marked as deprecated in the documentation,
+ // but is it really necessary to force users to install a PECL
+ // extension?
+ $details['mime'] = mime_content_type($file);
+ }
+
+ return $details['mime'];
+
+ } // get_mime_info()
+
+ /**
+ * return tag-name by tag-idx
+ *
+ * this function returns the tag-name for the requested
+ * tag specified by tag-idx.
+ * @param integer $idx
+ * @return string
+ */
+ public function get_tag_name($idx)
+ {
+ if($result = $this->db->db_fetchSingleRow("
+ SELECT name
+ FROM tags
+ WHERE
+ id LIKE '". $idx ."'")) {
+
+ return $result['name'];
+
+ }
+
+ return 0;
+
+ } // get_tag_name()
+
} // class PHPFSPOT
?>