X-Git-Url: https://git.nubati.net/cgi-bin/gitweb.cgi?p=phpfspot.git;a=blobdiff_plain;f=phpfspot.class.php;h=3f7f7b299289fa3747006e4c3a3b5fc5a29ad40f;hp=088e74d349590939b8f25343aa6ae850010fa8ba;hb=375de618fb1ffaada3ae2f1e99f9706427b6abcd;hpb=af297e166b77efb1746f1d396b404102e0f89e15 diff --git a/phpfspot.class.php b/phpfspot.class.php index 088e74d..3f7f7b2 100644 --- a/phpfspot.class.php +++ b/phpfspot.class.php @@ -54,7 +54,7 @@ class PHPFSPOT { /* set application name and version information */ $this->cfg->product = "phpfspot"; - $this->cfg->version = "1.3"; + $this->cfg->version = "1.4"; $this->sort_orders= array( 'date_asc' => 'Date ↑', @@ -460,8 +460,10 @@ class PHPFSPOT { $thumb_path = $this->get_thumb_path($this->cfg->photo_width, $photo); } - /* get f-spot database meta information */ - $meta = $this->get_meta_informations($orig_path); + /* get EXIF information if JPEG */ + if($details['mime'] == "image/jpeg") { + $meta = $this->get_meta_informations($orig_path); + } /* If EXIF data are available, use them */ if(isset($meta['ExifImageWidth'])) { @@ -689,6 +691,57 @@ class PHPFSPOT { } // resetTags() + /** + * returns the value for the autocomplet tag-search + */ + public function get_xml_tag_list() + { + if(!isset($_GET['search']) || !is_string($_GET['search'])) + $_GET['search'] = ''; + + $length = 15; + $i = 1; + + /* retrive tags from database */ + $this->get_tags(); + + $matched_tags = Array(); + + header("Content-Type: text/xml"); + + $string = "\n"; + $string.= "\n"; + + foreach($this->avail_tags as $tag) + { + if(!empty($_GET['search']) && + preg_match("/". $_GET['search'] ."/i", $this->tags[$tag]) && + count($matched_tags) < $length) { + + $count = $this->get_num_photos($tag); + + if($count == 1) { + $string.= " ". $this->tags[$tag] ."\n"; + } + else { + $string.= " ". $this->tags[$tag] ."\n"; + + } + $i++; + } + + /* if we have collected enough items, break out */ + if(count($matched_tags) >= $length) + break; + } + + $string.= "\n"; + + return $string; + + } // get_xml_tag_list() + + /** * reset single photo * @@ -983,6 +1036,7 @@ class PHPFSPOT { $img_width[$thumbs] = Array(); $img_id[$thumbs] = Array(); $img_name[$thumbs] = Array(); + $img_fullname[$thumbs] = Array(); $img_title = Array(); for($i = $begin_with; $i < $end_with; $i++) { @@ -992,6 +1046,7 @@ class PHPFSPOT { $images[$thumbs] = $photos[$i]; $img_id[$thumbs] = $i; $img_name[$thumbs] = htmlspecialchars($this->getPhotoName($photos[$i], 15)); + $img_fullname[$thumbs] = htmlspecialchars($this->getPhotoName($photos[$i], 0)); $img_title[$thumbs] = "Click to view photo ". htmlspecialchars($this->getPhotoName($photos[$i], 0)); $thumb_path = $this->get_thumb_path($this->cfg->thumb_width, $photos[$i]); @@ -1122,6 +1177,7 @@ class PHPFSPOT { $this->tmpl->assign('rss_link', $rss_link); $this->tmpl->assign('count', $count); $this->tmpl->assign('width', $this->cfg->thumb_width); + $this->tmpl->assign('preview_width', $this->cfg->photo_width); $this->tmpl->assign('thumb_container_width', $this->cfg->thumb_width); $this->tmpl->assign('thumb_container_height', $this->cfg->thumb_height+20); $this->tmpl->assign('images', $images); @@ -1129,6 +1185,7 @@ class PHPFSPOT { $this->tmpl->assign('img_height', $img_height); $this->tmpl->assign('img_id', $img_id); $this->tmpl->assign('img_name', $img_name); + $this->tmpl->assign('img_fullname', $img_fullname); $this->tmpl->assign('img_title', $img_title); $this->tmpl->assign('thumbs', $thumbs); @@ -1177,128 +1234,164 @@ class PHPFSPOT { if(!$this->checkifImageSupported($details['mime'])) return false; - $meta = $this->get_meta_informations($orig_image); - - $rotate = 0; - $flip_hori = false; - $flip_vert = false; - - switch($meta['Orientation']) { - case 1: /* top, left */ - /* nothing to do */ break; - case 2: /* top, right */ - $rotate = 0; $flip_hori = true; break; - case 3: /* bottom, left */ - $rotate = 180; break; - case 4: /* bottom, right */ - $flip_vert = true; break; - case 5: /* left side, top */ - $rotate = 90; $flip_vert = true; break; - case 6: /* right side, top */ - $rotate = 90; break; - case 7: /* left side, bottom */ - $rotate = 270; $flip_vert = true; break; - case 8: /* right side, bottom */ - $rotate = 270; break; - } - - $src_img = @imagecreatefromjpeg($orig_image); - - if(!$src_img) { - print "Can't load image from ". $orig_image ."\n"; - return false; - } + switch($details['mime']) { + + case 'image/jpeg': + + $meta = $this->get_meta_informations($orig_image); + + $rotate = 0; + $flip_hori = false; + $flip_vert = false; + + switch($meta['Orientation']) { + case 1: /* top, left */ + /* nothing to do */ break; + case 2: /* top, right */ + $rotate = 0; $flip_hori = true; break; + case 3: /* bottom, left */ + $rotate = 180; break; + case 4: /* bottom, right */ + $flip_vert = true; break; + case 5: /* left side, top */ + $rotate = 90; $flip_vert = true; break; + case 6: /* right side, top */ + $rotate = 90; break; + case 7: /* left side, bottom */ + $rotate = 270; $flip_vert = true; break; + case 8: /* right side, bottom */ + $rotate = 270; break; + } - /* grabs the height and width */ - $cur_width = imagesx($src_img); - $cur_height = imagesy($src_img); + $src_img = @imagecreatefromjpeg($orig_image); + $handler = "gd"; + 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; - } + case 'image/png': - // If the image will be rotate because EXIF orientation said so - // 'virtually rotate' the image for further calculations - if($rotate == 90 || $rotate == 270) { - $tmp = $cur_width; - $cur_width = $cur_height; - $cur_height = $tmp; - } + $src_img = @imagecreatefrompng($orig_image); + $handler = "gd"; + break; - /* calculates aspect ratio */ - $aspect_ratio = $cur_height / $cur_width; + case 'image/tiff': + + $src_img = new Imagick($orig_image); + print_r($src_img->queryFormats()); + + $handler = "imagick"; + exit(1); + break; - /* sets new size */ - if($aspect_ratio < 1) { - $new_w = $width; - $new_h = abs($new_w * $aspect_ratio); - } else { - /* 'virtually' rotate the image and calculate it's ratio */ - $tmp_w = $cur_height; - $tmp_h = $cur_width; - /* now get the ratio from the 'rotated' image */ - $tmp_ratio = $tmp_h/$tmp_w; - /* now calculate the new dimensions */ - $tmp_w = $width; - $tmp_h = abs($tmp_w * $tmp_ratio); - - // now that we know, how high they photo should be, if it - // gets rotated, use this high to scale the image - $new_h = $tmp_h; - $new_w = abs($new_h / $aspect_ratio); - - // If the image will be rotate because EXIF orientation said so - // now 'virtually rotate' back the image for the image manipulation - if($rotate == 90 || $rotate == 270) { - $tmp = $new_w; - $new_w = $new_h; - $new_h = $tmp; - } } - /* creates new image of that size */ - $dst_img = imagecreatetruecolor($new_w, $new_h); - imagefill($dst_img, 0, 0, ImageColorAllocate($dst_img, 255, 255, 255)); + switch($handler) { - /* 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)); + case 'gd': - /* 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'); - } + if(!isset($src_img) || empty($src_img)) { + print "Can't load image from ". $orig_image ."\n"; + return false; + } - if($rotate) { - $this->_debug("(ROTATE)"); - $dst_img = $this->rotateImage($dst_img, $rotate); - } + /* 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; + } - /* write down new generated file */ - $result = imagejpeg($dst_img, $thumb_image, 75); + // If the image will be rotate because EXIF orientation said so + // 'virtually rotate' the image for further calculations + if($rotate == 90 || $rotate == 270) { + $tmp = $cur_width; + $cur_width = $cur_height; + $cur_height = $tmp; + } - /* free your mind */ - imagedestroy($dst_img); - imagedestroy($src_img); + /* calculates aspect ratio */ + $aspect_ratio = $cur_height / $cur_width; - if($result === false) { - print "Can't write thumbnail ". $thumb_image ."\n"; - return false; - } + /* sets new size */ + if($aspect_ratio < 1) { + $new_w = $width; + $new_h = abs($new_w * $aspect_ratio); + } else { + /* 'virtually' rotate the image and calculate it's ratio */ + $tmp_w = $cur_height; + $tmp_h = $cur_width; + /* now get the ratio from the 'rotated' image */ + $tmp_ratio = $tmp_h/$tmp_w; + /* now calculate the new dimensions */ + $tmp_w = $width; + $tmp_h = abs($tmp_w * $tmp_ratio); + + // now that we know, how high they photo should be, if it + // gets rotated, use this high to scale the image + $new_h = $tmp_h; + $new_w = abs($new_h / $aspect_ratio); + + // If the image will be rotate because EXIF orientation said so + // now 'virtually rotate' back the image for the image manipulation + if($rotate == 90 || $rotate == 270) { + $tmp = $new_w; + $new_w = $new_h; + $new_h = $tmp; + } + } - return true; + /* creates new image of that size */ + $dst_img = imagecreatetruecolor($new_w, $new_h); + + imagefill($dst_img, 0, 0, ImageColorAllocate($dst_img, 255, 255, 255)); + + /* 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)); + + /* 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'); + } + + if($rotate) { + $this->_debug("(ROTATE)"); + $dst_img = $this->rotateImage($dst_img, $rotate); + } + + /* write down new generated file */ + $result = imagejpeg($dst_img, $thumb_image, 75); + + /* 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': + + break; + + } } // create_thumbnail() @@ -1748,7 +1841,7 @@ class PHPFSPOT { */ public function checkifImageSupported($mime) { - if(in_array($mime, Array("image/jpeg"))) + if(in_array($mime, Array("image/jpeg", "image/png", "image/tiff"))) return true; return false; @@ -1963,7 +2056,12 @@ class PHPFSPOT { ". $details['description']); $orig_path = $this->translate_path($this->parse_uri($details['uri'], 'fullpath')); - $meta = $this->get_meta_informations($orig_path); + + /* get EXIF information if JPEG */ + if($details['mime'] == "image/jpeg") { + $meta = $this->get_meta_informations($orig_path); + } + $meta_date = isset($meta['FileDateTime']) ? $meta['FileDateTime'] : filemtime($orig_path); ?> @@ -2267,6 +2365,25 @@ class PHPFSPOT { { return $this->get_web_protocol() ."://". $this->get_server_name() . $this->cfg->web_path; } // get_phpfspot_url() + + /** + * returns the number of photos which are tagged with $tag_id + */ + public function get_num_photos($tag_id) + { + if($result = $this->db->db_fetchSingleRow(" + SELECT count(*) as number + FROM photo_tags + WHERE + tag_id LIKE '". $tag_id ."'")) { + + return $result['number']; + + } + + return 0; + + } // get_num_photos() /** * check file exists and is readable