/** * Lire toutes les exifs d'une image * et les memoriser en static pour optimisation * * @param string $fichier * @return array */ function extraire_exif($fichier) { static $mem_exif; if (isset($mem_exif[$fichier]) and $mem_exif[$fichier]) { return $mem_exif[$fichier]; } if (!file_exists($fichier)) { return array(); } $time = filemtime($fichier); $fichier_exif = sous_repertoire(_DIR_VAR, 'cache-exif') . md5($fichier . $time) . ".php"; // Systeme de cache pour les variables exif if (file_exists($fichier_exif)) { lire_fichier($fichier_exif, $cache); if ($mem_exif[$fichier] = unserialize($cache)) { return $mem_exif[$fichier]; } } include_spip("inc/exifReader"); $er = new phpExifReader($fichier); $er->processFile(); $mem_exif[$fichier] = $er->getImageInfo(); // Essayer de trouver aux:Lens $mem_exif[$fichier]["auxLens"] = str_replace(" mm", " ", lire_aux_lens($fichier)); // Completer GPS if (function_exists('exif_read_data')) { $exif_direc = @exif_read_data($fichier); // Si Latitude deja fixee, la traiter // Si la ref n'est ni N ni S, c'est une erreur (j'en trouve sur Flickr) if (!($exif_direc["GPSLatitudeRef"] == "N" || $exif_direc["GPSLatitudeRef"] == "S")) { unset($mem_exif[$fichier]["GPSLatitude"]); } if ($mem_exif[$fichier]["GPSLatitude"]) { $exif_direc["GPSLatitude"][0] = $mem_exif[$fichier]["GPSLatitude"]["Degrees"]; $exif_direc["GPSLatitude"][1] = $mem_exif[$fichier]["GPSLatitude"]["Minutes"] * 100 + round($mem_exif[$fichier]["GPSLatitude"]["Seconds"] / 60 * 100) . "/100"; $exif_direc["GPSLatitudeRef"] = $mem_exif[$fichier]["GPSLatitudeRef"]; } // Traiter la Latitude // Retourne GPSLatitude en degres, minutes, secondes // Retour GPSLatitudeInt en valeur entiere pour Google if (isset($exif_direc["GPSLatitude"])) { $deg = $exif_direc["GPSLatitude"][0]; if (strpos($deg, "/") > 0) { $deg = substr($deg, 0, strpos($deg, "/")); } $min = $exif_direc["GPSLatitude"][1]; if (strpos($min, "/") > 0) { $minutes = substr($min, 0, strpos($min, "/")); $rap = substr($min, strpos($min, "/") + 1, 12); $minutes = $minutes / $rap; $secondes = ($minutes - floor($minutes)) * 60; $minutes = floor($minutes); } $N_S = $exif_direc["GPSLatitudeRef"]; $mem_exif[$fichier]["GPSLatitude"] = $deg . "° {$minutes}" . "’" . " {$secondes}" . "” {$N_S}"; // Retourne aussi une valeur entiere pour Google Maps $GPSLatitudeInt = $deg + $min / 6000; if ($N_S == "S") { $GPSLatitudeInt = -1 * $GPSLatitudeInt; } $mem_exif[$fichier]["GPSLatitudeInt"] = $GPSLatitudeInt; } // Verifier que la precedente ref est E/W, sinon ne pas traiter if (!($exif_direc["GPSLongitudeRef"] == "E" || $exif_direc["GPSLongitudeRef"] == "W")) { unset($mem_exif[$fichier]["GPSLongitude"]); } if ($mem_exif[$fichier]["GPSLongitude"]) { $exif_direc["GPSLongitude"][0] = $mem_exif[$fichier]["GPSLongitude"]["Degrees"]; $exif_direc["GPSLongitude"][1] = $mem_exif[$fichier]["GPSLongitude"]["Minutes"] * 100 + round($mem_exif[$fichier]["GPSLongitude"]["Seconds"] / 60 * 100) . "/100"; $exif_direc["GPSLongitudeRef"] = $mem_exif[$fichier]["GPSLongitudeRef"]; } // Traiter longitude if (isset($exif_direc["GPSLongitude"])) { $deg = $exif_direc["GPSLongitude"][0]; if (strpos($deg, "/") > 0) { $deg = substr($deg, 0, strpos($deg, "/")); } $min = $exif_direc["GPSLongitude"][1]; if (strpos($min, "/") > 0) { $minutes = substr($min, 0, strpos($min, "/")); $rap = substr($min, strpos($min, "/") + 1, 12); $minutes = $minutes / $rap; $secondes = ($minutes - floor($minutes)) * 60; $minutes = floor($minutes); } $W_E = $exif_direc["GPSLongitudeRef"]; $mem_exif[$fichier]["GPSLongitude"] = $deg . "° {$minutes}" . "’" . " {$secondes}" . "” {$W_E}"; // Retourne aussi une valeur entiere pour Google Maps $GPSLongitudeInt = $deg + $min / 6000; if ($W_E == "W") { $GPSLongitudeInt = -1 * $GPSLongitudeInt; } $mem_exif[$fichier]["GPSLongitudeInt"] = $GPSLongitudeInt; } } ecrire_fichier($fichier_exif, serialize($mem_exif[$fichier])); return $mem_exif[$fichier]; }
function get_exif_size($filename, $image_name) { set_error_handler("on_error_no_output"); // is needed because error are most likly but we don't care about fields we don't even know $er = new phpExifReader($filename); $er->processFile(); $exif_info = $er->getImageInfo(); set_error_handler("on_error"); $size_array = array(); $size_array[2] = 2; if (isset($er->ImageInfo[TAG_EXIF_IMAGEWIDTH])) { $size_array[0] = $er->ImageInfo[TAG_EXIF_IMAGEWIDTH]; } else { $size_array[0] = 1024; debug("Size of image " . $image_name . " cannot be detected using 1024x768."); } if (isset($er->ImageInfo[TAG_EXIF_IMAGELENGTH])) { $size_array[1] = $er->ImageInfo[TAG_EXIF_IMAGELENGTH]; } else { $size_array[1] = 768; } return $size_array; }
/** * Get EXIF of file * * @param string $filename * @return array */ public function getExif($filename = null) { if (is_null($filename)) { return false; } App::import('Vendor', 'Nodeattachment.exif-reader.php'); $er = new phpExifReader($filename); $er->processFile(); return $er->getImageInfo(); }