' . gettext("Insert images in " . $base . " database.") . '
'; if (file_exists($base)) { echo '

Database ' . $base . ' already exist! Delete it !

'; unlink($base); } // Taille des vignettes $th_w = 300; $th_h = 300; $dir = (new AdvancedFilesystemIterator('photos/img/'))->match('/heic|HEIC|jpg|jpeg|JPG|JPEG|webp|WEBP|avif|AVIF$/'); echo '

' . count($dir) . gettext(' images found in folder') . ' photos/img/ ...

'; echo '

' . gettext("Creation of the database") . ' ' . $base . ' ' . gettext("and the table") . ' photo (' . gettext("if necessary") . ')...

'; try { // Création de la base et de la table photos $conn = new PDO("sqlite:db_photo.sqlite3"); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $query = "CREATE TABLE IF NOT EXISTS photos ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, filename TEXT NOT NULL, filesize TEXT, dateoriginal TEXT, lens TEXT, speed TEXT, correctexpo TEXT, iso INTEGER, usercomment TEXT, comment TEXT, model TEXT, metering TEXT, flash TEXT, focal TEXT, program TEXT, wb TEXT, mode TEXT, width INTEGER, height INTEGER, html TEXT, aperture TEXT, software TEXT, lat TEXT, long TEXT, alt TEXT, keywords TEXT, title TEXT, creator TEXT, city TEXT, department TEXT, code TEXT, country TEXT, copyright TEXT, legende TEXT, UNIQUE(filename) )"; // 33 entrées $conn->exec($query); } catch(PDOException $e) { echo $e->getMessage(); } echo '

' . gettext('Read image files in the folder') . ' photos/img/...

'; $i = 1; $photos = array(); foreach($dir as $file){ /* $file->getFilename() pathName() */ $file = $file->getpathName(); $x = in_bdd($file); /* if ($i > 5) { break; } */ // https://exiftool.org/TagNames/EXIF.html // https://exiftool.org/TagNames/Canon.html if ($x == false) { //false if ($exif = @exif_read_data($file, 0, true )) { //_pr($exif); unset($fla); unset($flash); $fs = isset($exif['FILE']['FileSize']) ? $exif['FILE']['FileSize'] : ''; $fsize = formatBytes($fs, $precision = 0); # YYYY-MM-DD HH:MM:SS.SSS - 2019:10:01 14:03:12 $da = isset($exif['EXIF']['DateTimeOriginal']) ? $exif['EXIF']['DateTimeOriginal'] : ''; if (isset($exif['EXIF']['DateTimeOriginal'])) { $d = explode(' ', $exif['EXIF']['DateTimeOriginal']); $da = str_replace(':', '-', $d[0]) . " " . $d[1] . ".000"; } else { $da = ''; } if (isset($exif['EXIF']['UndefinedTag:0xA434'])) { $w = trim($exif['EXIF']['UndefinedTag:0xA434']); $arr = array("600" => "EF600mm f/4L IS III USM", "100.0 mm" => "EF100mm f/2.8 Macro USM", "100.0-400.0 mm" => "EF100-400mm f/4.5-5.6L IS USM", "140.0-560.0 mm" => "EF100-400mm f/4.5-5.6L IS USM +1.4x II", "17.0-40.0 mm" => "EF17-40mm f/4L USM", "24-70mm" => "SIGMA 24-70mm F2.8 EX DG", "70.0-200.0 mm" => "EF70-200mm f/4L USM", "10.0-22.0 mm" => "EF-S10-22mm f/3.5-4.5 USM", "500.0 mm" => "SIGMA 500mm f/4.5 EX HSM", "500mm" => "SIGMA 500mm f/4.5 EX HSM"); if (array_key_exists($w, $arr)) $obj= $arr[$w]; else $obj = $w; } else { $obj = ''; } if (isset($exif['EXIF']['ExposureTime'])) { $q = explode('/', $exif['EXIF']['ExposureTime']); $sp = ($q[0] > 1) ? ($q[0] / $q[1]) . "s" : $exif['EXIF']['ExposureTime']; } else { $sp = ''; } $ev = isset($exif['EXIF']['ExposureBiasValue']) ? $exif['EXIF']['ExposureBiasValue'] : ''; $div = explode( "/", $ev); $dividende = $div[0]; $diviseur = $div[1]; if (str_starts_with($ev, '0')) { $ev = '0'; } elseif ($dividende === $diviseur) { $ev = '0'; } if ((! str_starts_with($ev, '0')) && (! str_starts_with($ev, '-'))) { $ev = "+" . $ev; } $iso = isset($exif['EXIF']['ISOSpeedRatings']) ? $exif['EXIF']['ISOSpeedRatings'] : ''; $uc = isset($exif['COMPUTED']['UserComment']) ? $exif['COMPUTED']['UserComment'] : ''; $comment = isset($exif['COMMENT']['0']) ? $exif['COMMENT']['0'] : ''; $mod = isset($exif['IFD0']['Model']) ? $exif['IFD0']['Model'] : ''; if (isset($exif['EXIF']['MeteringMode'])) { $mm = $exif['EXIF']['MeteringMode']; switch ($mm) { case 1: $mm = gettext("Average"); break; case 2: $mm = gettext("Center-weighted average"); // Moy. à pred. centrale break; case 3: $mm = gettext("Spot"); break; case 4: $mm = gettext("Multi-Spot"); break; case 5: $mm = gettext("Pattern"); // Mesure évaluative break; case 6: $mm = gettext("Partial"); // Mesure sélective break; default: $mm = gettext("Unknown") . ': ' . $mm; // Evaluative Mesure évaluative // Centre-weighted Average Moy. à pred. centrale // Partial Mesure sélective // Spot Spot // Pattern =Mesure évaluative (30D) // Average Mesure évaluative } } else { $mm = ''; } // https://stackoverflow.com/questions/7076958/read-exif-and-determine-if-the-flash-has-fired if (isset($exif['EXIF']['Flash'])) { $fla = $exif['EXIF']['Flash']; $flash = $fla; //$flashfired = ($fla & 1) != 0; //echo "flashfired: " . $flashfired . "
"; // 12_2018.jpg No Flash 0 // 5_2013.jpg Off, Did not fire 16 // folder flash 9 switch ($fla) { case 0: $fla = gettext("No Flash"); break; case 9: $fla = gettext("On, Fired"); break; case 16: $fla = gettext("Off, Did not fire"); break; default: $fla = gettext("Unknown"); } /* Exiftool: [Flash] => On, Fired [Flash Compensation] => -1 */ /* 0x0 = No Flash 0x1 = Fired 0x5 = Fired, Return not detected 0x7 = Fired, Return detected 0x8 = On, Did not fire 0x9 = On, Fired 0xd = On, Return not detected 0xf = On, Return detected 0x10 = Off, Did not fire 0x14 = Off, Did not fire, Return not detected 0x18 = Auto, Did not fire 0x19 = Auto, Fired 0x1d = Auto, Fired, Return not detected 0x1f = Auto, Fired, Return detected 0x20 = No flash function 0x30 = Off, No flash function 0x41 = Fired, Red-eye reduction 0x45 = Fired, Red-eye reduction, Return not detected 0x47 = Fired, Red-eye reduction, Return detected 0x49 = On, Red-eye reduction 0x4d = On, Red-eye reduction, Return not detected 0x4f = On, Red-eye reduction, Return detected 0x50 = Off, Red-eye reduction 0x58 = Auto, Did not fire, Red-eye reduction 0x59 = Auto, Fired, Red-eye reduction 0x5d = Auto, Fired, Red-eye reduction, Return not detected 0x5f = Auto, Fired, Red-eye reduction, Return detected */ } else { $fla = ''; } if (isset($exif['EXIF']['FocalLength'])) { $k = explode('/', $exif['EXIF']['FocalLength']); $fl = $k[0] . " mm"; } else { $fl = ''; } if (isset($exif['EXIF']['ExposureProgram'])) { $ep = $exif['EXIF']['ExposureProgram']; // 0 switch ($ep) { case 0: $ep = gettext("EasyShoot"); break; case 1: $ep = gettext("Program"); break; case 2: $ep = gettext("Tv (Shutter speed priority)"); break; case 3: $ep = gettext("Av (Aperture-priority)"); break; case 4: $ep = gettext("Manual"); break; case 5: $ep = gettext("Auto-DEP"); break; case 6: $ep = gettext("M-DEP"); break; case 7: $ep = gettext("Bulb"); break; case 8: $ep = gettext("F (Flexible-priority)"); break; default: $ep = gettext("Unknown"); } } else { $ep = ''; } if (isset($exif['EXIF']['WhiteBalance'])) { $wb = $exif['EXIF']['WhiteBalance']; switch ($wb) { case 0: $wb = gettext("Auto"); break; case 1: $wb = gettext("Daylight"); break; case 2: $wb = gettext("Cloudy"); break; case 3: $wb = gettext("Tungsten"); break; case 4: $wb = gettext("Fluorescent"); break; case 5: $wb = gettext("Flash"); break; case 6: $wb = gettext("Custom"); break; case 7: $wb = gettext("Black & White"); break; case 8: $wb = gettext("Shade"); break; case 9: $wb = gettext("Manual Temperature (Kelvin)"); break; default: $wb = gettext("Unknown"); } } else { $wb = ''; } if (isset($exif['EXIF']['ExposureMode'])) { $em = $exif['EXIF']['ExposureMode']; //$em = hexdec(intel2Moto($exif['EXIF']['ExposureMode'])); //echo $em; switch ($em) { case 0: $em = gettext("OFF"); break; case 1: $em = gettext("ON"); break; default: $em = gettext("Unknown"); } /* switch ($ep) { case 1: $ep = gettext('Manual'); break; case 2: $ep = gettext('Program'); break; case 3: $ep = gettext('Aperture Priority'); break; case 4: $ep = gettext('Shutter Priority'); break; case 5: $ep = gettext('Program Creative'); break; case 6: $ep = gettext('Program Action'); break; case 7: $ep = gettext('Portrait'); break; case 8: $ep = gettext('Landscape'); break; default: $ep = gettext('Unknown') . ': ' . $ep; break; } */ } else { $em = ''; } $wi = isset($exif['COMPUTED']['Width']) ? $exif['COMPUTED']['Width'] : ''; $he = isset($exif['COMPUTED']['Height']) ? $exif['COMPUTED']['Height'] : ''; $ht = isset($exif['COMPUTED']['html']) ? $exif['COMPUTED']['html'] : ''; $ap = isset($exif['COMPUTED']['ApertureFNumber']) ? $exif['COMPUTED']['ApertureFNumber'] : ''; $soft = isset($exif['IFD0']['Software']) ? $exif['IFD0']['Software'] : ''; $gps = get_gps($exif); $photos[$i] = array( 'filename' => $file, 'filesize' => $fsize, 'dateoriginal' => $da, 'lens' => $obj, 'speed' => $sp, 'correctexpo' => $ev, 'iso' => $iso, 'usercomment' => $uc, 'comment' => $comment, 'model' => $mod, 'metering' => $mm, 'flash' => $fla, 'focal' => $fl, 'program' => $ep, 'wb' => $wb, 'mode' => $em, 'width' => $wi, 'height' => $he, 'html' => $ht, 'aperture' => $ap, 'software' => $soft, 'lat' => $gps['latitude'], 'long' => $gps['longitude'], 'alt' => $gps['altitude'], ); } if ($iptc = @getimagesize($file, $info)) { //zz = iptcparse($info['APP1']); //_pr(zz); //$ww = iptcparse($info['8BIM']); //_pr(ww); if (isset($info["APP13"])) { $mots = ""; $iptc = iptcparse ($info["APP13"]); //_pr($iptc); /* '2#005'=>'DocumentTitle', '2#010'=>'Urgency', '2#015'=>'Category', '2#020'=>'Subcategories', '2#040'=>'SpecialInstructions', '2#055'=>'CreationDate', 20240619 '2#080'=>'AuthorByline', '2#085'=>'AuthorTitle', '2#090'=>'City', '2#095'=>'State', '2#101'=>'Country', '2#103'=>'OTR', '2#105'=>'Headline', '2#110'=>'Source', '2#115'=>'PhotoSource', '2#116'=>'Copyright', '2#120'=>'Caption', '2#122'=>'CaptionWriter' '1#090'=>'CodedCharacterSet' %G '2#060' 200514+0200 '2#062' 20240619 '2#063' 200514+0200 */ $mots_cles = (isset($iptc["2#025"])) ? $iptc["2#025"] : ''; // array - ok if (!empty($mots_cles)) { foreach ($mots_cles as $key => $val) { $mots .= strtolower($val) . ","; } $mots = substr($mots, 0, -1); } $titre = (isset($iptc["2#005"][0])) ? $iptc["2#005"][0] : ''; // ok $creator = (isset($iptc["2#080"][0])) ? $iptc["2#080"][0] : ''; //ok //$AuthorTitle = (isset($iptc["2#085"][0])) ? $iptc["2#085"][0] : ''; $ville = (isset($iptc["2#090"][0])) ? $iptc["2#090"][0] : ''; //ok $departement = (isset($iptc["2#095"][0])) ? $iptc["2#095"][0] : ''; //ok $code = (isset($iptc["2#100"][0])) ? $iptc["2#100"][0] : ''; //ok $pays = (isset($iptc["2#101"][0])) ? $iptc["2#101"][0] : ''; //ok //$title = (isset($iptc["2#105"][0])) ? $iptc["2#105"][0] : ''; $copyright = (isset($iptc["2#116"][0])) ? $iptc["2#116"][0] : ''; //ok $legende = (isset($iptc["2#120"][0])) ? $iptc["2#120"][0] : ''; //ok /* _pr($mots_cles); // ok echo $city . "
"; //ok echo $creator . "
"; // ok echo $AuthorTitle . "
"; echo $ville . "
"; //ok echo $departement . "
"; //ok echo $code . "
"; echo $pays . "
"; //ok echo $title . "
"; //ok echo $copyright . "
"; echo $legende . "
"; */ $photos[$i]['keywords'] = $mots; $photos[$i]['title'] = $titre; $photos[$i]['creator'] = $creator; $photos[$i]['city'] = $ville; $photos[$i]['department'] = $departement; $photos[$i]['code'] = $code; $photos[$i]['country'] = $pays; $photos[$i]['copyright'] = $copyright; $photos[$i]['legende'] = $legende; } /* else { $photos[$i]['mots_cles'] = ''; $photos[$i]['titre'] = ''; $photos[$i]['creator'] = ''; $photos[$i]['ville'] = ''; $photos[$i]['departement'] = ''; $photos[$i]['code'] = ''; $photos[$i]['pays'] = ''; $photos[$i]['copyright'] = ''; $photos[$i]['legende'] = ''; } */ } } $i++; } // _pr($photos); $z = count($photos); if ($z == 0) { echo '

' . gettext('No new image files to add') . '...

'; echo ''; die(); } //_pr($photos); $query5 = "SELECT MAX(id) FROM photos"; $stmt = $conn->prepare($query5); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $avant = $resultat['MAX(id)']; $nb_avant = (isset($avant)) ? $avant : 0; echo '

' . gettext('Creation of thumbnails') . ' ('. $th_w . 'px x ' . $th_h . 'px) ' . gettext('in the folder') . ' photos/thumb/.

'; $b = ($z > 1) ? gettext('new images') : gettext('new image'); echo '

' . gettext('Insertion of ') . $z . ' ' . $b . gettext(' in database') . '...

'; // Insertion des photos dans la base // Création des vignettes try { $query2 = "INSERT OR IGNORE INTO photos (filename, filesize, dateoriginal, lens, speed, correctexpo, iso, usercomment, comment, model, metering, flash, focal, program, wb, mode, width, height, html, aperture, software, lat, long, alt, keywords, title, creator, city, department, code, country, copyright, legende) VALUES (:filename, :filesize, :dateoriginal, :lens, :speed, :correctexpo, :iso, :usercomment, :comment, :model, :metering, :flash, :focal, :program, :wb, :mode, :width, :height, :html, :aperture, :software, :lat, :long, :alt, :keywords, :title, :creator, :city, :department, :code, :country, :copyright, :legende)"; $stmt = $conn->prepare($query2); $stmt->bindParam(':filename', $file); $stmt->bindParam(':filesize', $fsize); $stmt->bindParam(':dateoriginal', $da); $stmt->bindParam(':lens', $obj); $stmt->bindParam(':speed', $sp); $stmt->bindParam(':correctexpo', $ev); $stmt->bindParam(':iso', $iso); $stmt->bindParam(':usercomment', $uc); $stmt->bindParam(':comment', $comment); $stmt->bindParam(':model', $mod); $stmt->bindParam(':metering', $mm); $stmt->bindParam(':flash', $fla); $stmt->bindParam(':focal', $fl); $stmt->bindParam(':program', $ep); $stmt->bindParam(':wb', $wb); $stmt->bindParam(':mode', $em); $stmt->bindParam(':width', $wi); $stmt->bindParam(':height', $he); $stmt->bindParam(':html', $ht); $stmt->bindParam(':aperture', $ap); $stmt->bindParam(':software', $soft); $stmt->bindParam(':lat', $gps['latitude']); $stmt->bindParam(':long', $gps['longitude']); $stmt->bindParam(':alt', $gps['altitude']); $stmt->bindParam(':keywords', $mots); $stmt->bindParam(':title', $titre); $stmt->bindParam(':creator', $creator); $stmt->bindParam(':city', $ville); $stmt->bindParam(':department', $departement); $stmt->bindParam(':code',$code); $stmt->bindParam(':country',$pays); $stmt->bindParam(':copyright', $copyright); $stmt->bindParam(':legende', $legende); if (isset($photos)) { //_pr($photos); foreach ($photos as $item) { $file = $item['filename']; // *** photos/img/3_2023.jpg $fsize = $item['filesize']; // 232 Ko $da = $item['dateoriginal']; // *** 2023-03-04 10:05:25.000 $obj = $item['lens']; // *** EF600mm f/4L IS III USM +1.4x III $sp = $item['speed']; // *** 1/3200 $ev = $item['correctexpo']; // -1/3 $iso = $item['iso']; // *** 800 $uc = $item['usercomment']; $comment = $item['comment']; // Optimized by JPEGmini 3.18.9.220874607-AV 0x21824209 $mod = $item['model']; // *** Canon EOS R7 $mm = $item['metering']; // *** Mesure évaluative $fla = $item['flash']; // Off $fl = $item['focal']; // *** 840 mm $ep = $item['program']; // Av (Priorité ouverture) $wb = $item['wb']; // *** Lumière du jour $em = $item['mode']; // OFF $wi = $item['width']; // 1600 $he = $item['height']; // 1067 $ht = $item['html']; // width="1600" height="1067" $ap = $item['aperture']; // *** f/6.3 $soft = $item['software']; // Adobe Photoshop Lightroom Classic 12.2.1 (Macintosh) $gps['latitude'] = $item['lat']; // *** 47.169489533333 $gps['longitude'] = $item['long']; // *** 4.7472749 $gps['altitude'] = $item['alt']; // *** 492 $mots = $item['keywords']; // *** falco peregrinus,falconidés,falconiformes,faucon pèlerin,oiseaux,_vert_,falaise,femelle $creator = $item['creator']; // Pesenti $ville = $item['city']; // Antheuil $departement = $item['department']; // Côte-d'Or $code = $item['code']; // FR $pays = $item['country']; // France $copyright = $item['copyright']; // clicclac.info $titre = $item['title']; // *** $legende = $item['legende']; // *** create_thumb($th_w, $th_h, $file); $stmt->execute(); } } echo "
"; } catch(PDOException $e) { echo $e->getMessage(); } /* Affichage depuis la bdd des dernières images ajoutées */ /* try { $query4 = "SELECT filename, dateoriginal, lens, speed, iso, width, height, html, aperture, model, lat, long, alt, legende, copyright, title, creator, keywords, metering, flash, focal, wb, program FROM photos WHERE id > ? ORDER BY dateoriginal DESC"; //$query4 = "SELECT filename, date, lens, speed, iso, width, height, html, aperture, model, lat, long, alt, legende, copyright, title, creator, keywords FROM photos WHERE lat != '' OR long != '' ORDER BY date DESC"; $stmt = $conn->prepare($query4); $stmt->bindValue(1, $nb_avant, SQLITE3_INTEGER); // (1,3...) 1=1ere valeur 3=valeur # id 1 -> 3 //$stmt->execute(array(1, 3)); // WHERE id >= ? AND id <= ? ORDER BY date DESC"; $stmt->execute(); //$row = $stmt->fetchAll(PDO::FETCH_ASSOC); //_pr($result); echo '

' . gettext('Reading added photos') . ':

'; echo '
'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $thumbnail = host() . str_replace("photos/img", "photos/thumb", $row['filename']); $full = host() . $row['filename']; echo ''; } echo '
' . gettext('Thumb') . '' . gettext('Filename') . '' . gettext('Date') . '' . gettext('Lens') . '' . gettext('Speed') . '' . gettext('Iso') . '' . gettext('Width') . '' . gettext('Height') . '' . gettext('Html') . '' . gettext('Aperture') . '' . gettext('Model') . '' . gettext('Latitude') . '' . gettext('Longitude') . '' . gettext('Alttitude') . '' . gettext('Legende') . '' . gettext('Copyright') . '' . gettext('Title') . '' . gettext('Creator') . '' . gettext('Keywords') . '' . gettext('Metering') . '' . gettext('Flash') . '' . gettext('Focal') . '' . gettext('Wb') . '' . gettext('Program') . '
' . '' . '' . $row['filename'] . '' . $row['dateoriginal'] . '' . $row['lens'] . '' . $row['speed'] . '' . $row['iso'] . '' . $row['width'] . '' . $row['height'] . '' . $row['html'] . '' . $row['aperture'] . '' . $row['model'] . '' . $row['lat'] . '' . $row['long'] . '' . $row['alt'] . '' . $row['legende'] . '' . $row['copyright'] . '' . $row['title'] . '' . $row['creator'] . '' . $row['keywords'] . '' . $row['metering'] . '' . $row['flash'] . '' . $row['focal'] . '' . $row['wb'] . '' . $row['program'] . '
'; echo '
'; $conn = null; } catch(PDOException $e) { echo $e->getMessage(); } */ ?>

© 2013- sur-le-sentier.fr