X-Git-Url: https://git.nubati.net/cgi-bin/gitweb.cgi?p=phpfspot.git;a=blobdiff_plain;f=phpfspot.class.php;h=bae4ae74dbc40ce34899bb4270397a3860000abf;hp=ccfbd2529446fdf966442431972eda0593989b27;hb=dee52ad356dbabf693686fee2b0dc9138f265a3f;hpb=7703bb616f1966c47a230f5027b4f718769857d6 diff --git a/phpfspot.class.php b/phpfspot.class.php index ccfbd25..bae4ae7 100644 --- a/phpfspot.class.php +++ b/phpfspot.class.php @@ -28,6 +28,9 @@ require_once "phpfspot_db.php"; /** * PHPFSPOT main class * + * this class contains the most functions which will to the major + * work for phpfspot. + * * @package phpfspot */ class PHPFSPOT { @@ -119,7 +122,7 @@ class PHPFSPOT { /* 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 ↑', @@ -764,10 +767,15 @@ class PHPFSPOT { 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() @@ -1334,7 +1342,7 @@ class PHPFSPOT { } // 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 @@ -1351,13 +1359,13 @@ class PHPFSPOT { 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': @@ -1387,32 +1395,66 @@ class PHPFSPOT { } $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 @@ -1454,43 +1496,87 @@ class PHPFSPOT { } } - /* 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() @@ -1566,10 +1652,27 @@ class PHPFSPOT { 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) { @@ -1872,8 +1975,11 @@ class PHPFSPOT { $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; @@ -1975,7 +2081,14 @@ class PHPFSPOT { */ 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; @@ -2422,11 +2535,26 @@ class PHPFSPOT { { $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']); } @@ -2563,7 +2691,7 @@ class PHPFSPOT { * error message * @param string $file * @param boolean $silent - * @retrun boolean + * @return boolean */ private function check_readable($file, $silent = null) { @@ -2792,6 +2920,57 @@ class PHPFSPOT { } // 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($orig_image); + + /* 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 ?>