Annonce

#1 2006-08-29 10:43:54

phgiraud
Membre
2006-08-23
37

Présentation des infos EXIF

Pour obtenir une présentation des données de prise de vue sous cette forme:
http://img138.imageshack.us/img138/1554/exifsmf9.png

voici mes modifications:

Tout d'abord indiquer dans la conf. les champs EXIF désirés:
include/config_local.inc.php

Code:

$conf['show_exif_fields'] = array( // champs EXIF montrés avec l'image
  'Make',
  'ExposureTime',
  'COMPUTED;ApertureFNumber',
  'FocalLength',
  'ISOSpeedRatings',
  'ExposureBiasValue',
  'ExposureProgram',
  'LightSource',
  'Flash',
  );

Il faut ensuite retravailler les données pour qu'elles apparaissent de manière lisible et en français.
Une petite fonction pour calculer la valeur d'une fraction (les vitesses de déclenchement sous souvent renvoyées sous cette forme):
include/picture_metadata.inc.php

Code:

// ajouter fonction pour calculer une fraction ex. '20/100' => 0.2F
function compute_fraction($value)
{
  $tokens = explode('/', $value);
  if (count($tokens)!=2) return $value ;
  return floatval($tokens[0]) / floatval($tokens[1]) ;
}

Ensuite, traiter au cas par cas les champs EXIF (unités, énumérations etc.). Modifier le block "if (isset($exif[$field]))" comme suit:
include/picture_metadata.inc.php

Code:

if (isset($exif[$field]))
        {
          // ************ PHG mouline data
          $key = $field;
          $champ = $field;
          if (isset($lang['exif_field_'.$field])) $key = $lang['exif_field_'.$field];
          $value = $exif[$field] ;
          if ($champ==='Make') $value.=' '.$exif['Model'];
          else if ($champ==='FocalLength') {
            $value = compute_fraction($value) ;
            $value.='mm';
          } else if ($champ==="ExposureTime") {
            $value = compute_fraction($value) ;
            if ($value<1) {
              $value=1/$value ;
              $value="1/".$value ;
            }
            $value.="s";
          } else if ($champ==='ExposureBiasValue') {
            $value = compute_fraction($value) ;
            if ($value>0) $value='+'.$value;
            $value.=' EV';
          } else if ($champ==='ExposureProgram') {
            $sct = $exif['SceneCaptureType'];
            $value='' ;
            if ($sct>2) $value=$sct.' ';
            $exp = $exif['ExposureProgram'];
            switch($exp) {
              case 0: if ($sct===0) $value='Bougie' ; else $value='?'; break;
              case 1: $value.='M'; break;
              case 2: $value.='P'; break;
              case 3: $value.='A'; break;
              case 4: $value.='S'; break;
              case 5: $value.='Plage'; break;
              case 6: $value.='Sport'; break;
              case 7: $value.='Portrait'; break;
              case 8: $value.='Paysage'; break;
              default: $value.='Autre ('.$exp.')' ; break;
            }
          } else if ($champ==='LightSource') {
            switch($value) {
              case 0: $value="Auto"; break;
              case 1: $value="Jour"; break;
              case 2: $value="Fluorescent"; break;
              case 3: $value="Incandescent"; break;
              case 4: $value="Flash"; break;
              case 9: $value="Beau temps"; break;
              case 10: $value="Nuageux"; break;
              case 11: $value="Ombragé"; break;
              case 12: $value="Daylight fluorescent (D 5700 – 7100K)"; break;
              case 13: $value="Day white fluorescent (N 4600 – 5400K)"; break;
              case 14: $value="Cool white fluorescent (W 3900 – 4500K)"; break;
              case 15: $value="White fluorescent (WW 3200 – 3700K)"; break;
              case 17: $value="Standard light A"; break;
              case 18: $value="Standard light B"; break;
              case 19: $value="Standard light C"; break;
              case 20: $value="D55"; break;
              case 21: $value="D65"; break;
              case 22: $value="D75"; break;
              case 23: $value="D50"; break;
              case 24: $value="ISO studio tungsten"; break;
              case 255: $value="Other light source"; break;
              default: $value="Reserved (".$value.")"; break;
            }
          } else if ($champ==='Flash') {
            switch($value) {
              case 0x00: $flash='non'; break;
              case 0x01: $flash='oui'; break;
              case 0x05: $flash='retour ko'; break;
              case 0x07: $flash='retour ok'; break;
              case 0x09: $flash='oui, forcé'; break;
              case 0x0D: $flash='oui, forcé, retour ko'; break;
              case 0x0F: $flash='oui, forcé, retour ok'; break;
              case 0x10: $flash='non, forcé'; break;
              case 0x10: $flash='non, forcé'; break;
              case 0x18: $flash='non, auto'; break;
              case 0x19: $flash='oui, auto'; break;
              case 0x1D: $flash='oui, auto, retour ko'; break;
              case 0x1F: $flash='oui, auto, retour ok'; break;
              case 0x20: $flash='pas de flash'; break;
              case 0x41: $flash='oui, anti yeux rouges'; break;
              case 0x45: $flash='oui, anti yeux rouges, retour ko'; break;
              case 0x47: $flash='oui, anti yeux rouges, retour ok'; break;
              case 0x49: $flash='oui, forcé, anti yeux rouges'; break;
              case 0x4D: $flash='oui, forcé, anti yeux rouges, retour ko'; break;
              case 0x4F: $flash='oui, forcé, anti yeux rouges, retour ok'; break;
              case 0x59: $flash='oui, auto, anti yeux rouges'; break;
              case 0x5D: $flash='oui, auto, anti yeux rouges, retour ko'; break;
              case 0x5F: $flash='oui, auto, anti yeux rouges, retour ok'; break;
              default: $flash='Reserved'; break;
            }
            $value=$flash.' ('.dechex($value).')';
          }

          $template->assign_block_vars(
            'metadata.line',
            array(
              'KEY' => $key,
              'VALUE' => $value
              )
            );

Pour finir, quelques chaînes supplémentaires sont nécessaires en français:
language\fr_FR.iso-8859-1\common.lang.php

Code:

$lang['exif_field_Make'] = 'Appareil';
$lang['exif_field_ExposureTime'] = 'Vitesse';
$lang['exif_field_ApertureFNumber'] = 'Ouverture';
$lang['exif_field_FocalLength'] = 'Focale';
$lang['exif_field_ISOSpeedRatings'] = 'ISO';
$lang['exif_field_ExposureBiasValue'] = 'Biais';
$lang['exif_field_ExposureProgram'] = 'Mode';
$lang['exif_field_LightSource'] = 'Balance';

Hors ligne

#2 2006-08-29 12:29:05

Squale
Membre
2006-08-23
8

Re: Présentation des infos EXIF

Salut Phgiraud,

Tes explications sont très claires.

Tu vas peut-être pouvoir 'aider :
j'aurai voulu transformer la valeur en équivalent 35mm.

Comment doit on procéder sachant que j'ai plusieurs appareils avec des coefficients focale APN/focale equivalent 35 different.

Merci pour ton aide.

Hors ligne

#3 2006-08-29 15:40:10

phgiraud
Membre
2006-08-23
37

Re: Présentation des infos EXIF

La norme EXIF prévoit un champ pour cela: FocalLengthIn35mmFilm. Par contre, ce champ est rarement rempli par les APN (je vois que sur le mien il n'y a rien de tel). Il faut donc le calculer à la mano en fonction du modèle d'APN.

Je vais essayer sur ma gallerie et donnerai le code ici un peu + tard...

Hors ligne

#4 2006-08-29 16:53:09

phgiraud
Membre
2006-08-23
37

Re: Présentation des infos EXIF

Voilà qui est fait.

Dans config_local.inc.php, ajouter le champ EXIF FocalLengthIn35mmFilm :

Code:

$conf['show_exif_fields'] = array( // champs EXIF montrés avec l'image
  'Make',
  'ExposureTime',
  'COMPUTED;ApertureFNumber',
  'FocalLength',
  'FocalLengthIn35mmFilm',
  'ISOSpeedRatings',
  'ExposureBiasValue',
  'ExposureProgram',
  'LightSource',
  'Flash',
  );

Reprendre mon post ci-dessus, sur picture_metadata.inc.php, replacer le bloc else if ($champ==='FocalLength') par:

Code:

          else if ($champ==='FocalLength') {
            $value = compute_fraction($value) ;
            $value.='mm';
            if (isset($exif['FocalLengthIn35mmFilm'])) {
              $f35 = compute_fraction($exif['FocalLengthIn35mmFilm']) ;
            } else {
              if ($exif['Model']==='DSC-H1') $f35 = $value*6.0 ;
              else if ($exif['Model']==='E885') $f35 = $value*4.75 ;
              else if ($exif['Model']==='Canon EOS 350D DIGITAL') $f35 = $value*1.6 ;            
            }
            if (isset($f35)) $value.=' (equ. '.$f35.'mm)';

Ma modif regarde tout d'abord si le champ FocalLengthIn35mmFilm est positionné. Si c'est le cas, elle calcule la fraction (si nécessaire) et obtient la valeur dans $f35. Si le champ EXIF n'existe pas, elle calcule l'équivalence 35mm à partir de la focale réelle et en fonction du modèle d'appareil photo (ici, 3 modèles connus). Voir les specs. des APN pour ajouter d'autres modèles. Si la valeur a été trouvée, on ajoute (equ. XXmm) à côté de la valeur de la focale. Ce qui donne:

http://img181.imageshack.us/img181/2171/equlj2.png

Hors ligne

#5 2006-08-29 18:37:34

repie38
Former Piwigo Team
grenoble
2006-05-23
678

Re: Présentation des infos EXIF

Alors la, je dis bravo ! et merci
ca me sera tres utile :)

Hors ligne

#6 2006-08-29 18:47:18

robin64
Membre
Bayonne
2006-05-18
37

Re: Présentation des infos EXIF

Ben bravo...

Moi qui bidouille depuis des mois pour trouver une solution...
Merci à toi, c'est clair et surtout plus académique..


galerie
ver 1.7

Hors ligne

#7 2006-08-29 21:45:55

Nicco
Membre
Paris - Val de Marne
2006-05-12
1794

Re: Présentation des infos EXIF

ehhhhhhhhhh bennnn

y a pas a dire ... j adore phpwebgallery ... et surtout les mecs qui adorent phpwebgallery au point de nous inventer et nous trouver des trucs comme ca !!!

merci a toi car je vais de ce pas le faire sur ma galerie ...

et le plus top ca serai que cela devienne un truc officiel genre WIKI ou MOD histoire que tout le monde en profite

a+ et merci


Nicco Starrrr ..... voici ma galerie http://gallery-nicco.no-ip.org & ma passion http://bd-nicco.no-ip.org
version PWG 1.7.1 + de nombreux plugins actifs (trop pour les énumérer)

Hors ligne

#8 2006-08-29 22:24:24

Nicco
Membre
Paris - Val de Marne
2006-05-12
1794

Re: Présentation des infos EXIF

Bon voila ca marche nickel ...

maintenant mister phgiraud je voudrai savoir comment on peut faire evoluer ton MOD ... en ajoutant les infos necessaire a d autre APN
moi j ai de la chance j ai un canon 350 D ;o) et j ai vu que tu le gérais mais ma femmme a un Canon ixus 800 .... et la c est pas la meme

donc pour :

Focale      5.8mm

Flash     Reserved (58)

je voulais savoir 1) ou trouver les infos
et 2) ou changer dans picture_metadata.inc.php

et enfin je propose que chacun ajoute les infos des APN qu il connait comme ca apres on en aura un maximum !

voila a+


Nicco Starrrr ..... voici ma galerie http://gallery-nicco.no-ip.org & ma passion http://bd-nicco.no-ip.org
version PWG 1.7.1 + de nombreux plugins actifs (trop pour les énumérer)

Hors ligne

#9 2006-08-29 22:58:15

Squale
Membre
2006-08-23
8

Re: Présentation des infos EXIF

Merci pour ton aide si précieuse phgiraud,

Pour ma part voici ma modif pour le fichier include/picture_metadata.inc.php :
=================================================
      if (isset($exif[$field]))
        {
          // ************ PHG mouline data
          $key = $field;
          $champ = $field;
          if (isset($lang['exif_field_'.$field])) $key = $lang['exif_field_'.$field];
          $value = $exif[$field] ;
          if ($champ==='Make') $value.=' '; //.$exif['Model'];
          else if ($champ==='FocalLength') {
            $value = compute_fraction($value) ;
            $value.=' mm';
            if (isset($exif['FocalLengthIn35mmFilm'])) {
              $f35 = compute_fraction($exif['FocalLengthIn35mmFilm']) ;
            } else {
              if ($exif['Model']==='Canon PowerShot A75') $f35 = $value*6.48 ;
              else if ($exif['Model']==='FinePix S9500  ') $f35 = $value*4.51 ;           
            }
            if (isset($f35)) $value.=' (équiv. '.$f35.' mm)
          } else if ($champ==="ExposureTime") {
            $value = compute_fraction($value) ;
            if ($value<1) {
              $value=1/$value ;
              $value="1 / ".$value ;
            }
            $value.="s";
          }

          $template->assign_block_vars(
            'metadata.line',
            array(
              'KEY' => $key,
              'VALUE' => $value
              )
            );
         }
===================================================
Je n'ai modifié que la focale réélle en équivalent 35mm
Comme vous pouvez le voir dans le code, j'ai deux APN et leur coeff. focale sont :

Canon PowerShot A75  Coeff. correcteur de focale de 6.48
Fujifilm FinePix S9500  Coeff. correcteur de focale de 4.51

Attention à la bonne valeur du "Model", Mon Fuji est appellé "FinePix S9500  " (et oui y'a bien un espace) dans les données Exif. (ça m'a pris une bonne demi heure pour trouvé d'où ça venait)

Merci encore et vive ce forum ;-))

Hors ligne

#10 2006-08-29 23:01:09

Nicco
Membre
Paris - Val de Marne
2006-05-12
1794

Re: Présentation des infos EXIF

donc je commence :

              else if ($exif['Model']==='Canon EOS 350D DIGITAL') $f35 = round($value*1.6, 1) ;           
              else if ($exif['Model']==='Canon DIGITAL IXUS 800 IS') $f35 = round($value*6.03448, 1) ; 

j ai rajouté round pour avoir une valeur entiere a un chiffre apres la virgule

mais pour le programme et le flash c est pas bon


Nicco Starrrr ..... voici ma galerie http://gallery-nicco.no-ip.org & ma passion http://bd-nicco.no-ip.org
version PWG 1.7.1 + de nombreux plugins actifs (trop pour les énumérer)

Hors ligne

#11 2006-08-30 11:39:40

phgiraud
Membre
2006-08-23
37

Re: Présentation des infos EXIF

Merci pour vos commentaires!

Pour le programme, j'ai pris avec mon APN plein de photos sous tous les modes et en ai déduit la combinaison EXIF correspondante... Idéalement, il faudrait faire une gestion de cette combinaison par modèle d'APN... (c'est le genre de raison pour laquelle je n'écrit pas directement dans le WIKI)

Pour le flah, c'est standard EXIF:
page 36


En ce qui concerne le test sur le nom de modèle, et éviter les surprises sur l'espace en fin de chaîne:

Code:

              $model = trim($exif['Model']);
              if ($model==='DSC-H1') $f35 = $value*6.0 ;
              // etc...

Dernière modification par phgiraud (2006-08-30 12:01:42)

Hors ligne

#12 2006-09-07 17:02:30

edfred
Membre
2005-11-18
35

Re: Présentation des infos EXIF

Bonjour, je tente les modifications de début de post et j'obtiens cette erreur, pouvez-vous m'aider?
Merci.

ERREUR :

Code:

Parse error: parse error, unexpected $ in /homepages/6/d140283914/htdocs/phpwebgallery/include/picture_metadata.inc.php on line 157

Dernière modification par edfred (2006-09-07 17:03:10)

Hors ligne

#13 2006-09-07 17:07:42

phgiraud
Membre
2006-08-23
37

Re: Présentation des infos EXIF

Il faudrait que vous indiquiez à quel code correspond la ligne 157 chez vous ; dans mon cas cela fait partie du bloc swtich pour le flash où je ne vois rien de particulier...

Hors ligne

#14 2006-09-07 17:23:15

edfred
Membre
2005-11-18
35

Re: Présentation des infos EXIF

Bonjour, je crois qu'on peut se tutoyer!!!!!

Merci de ta réponse rapide!
Voilà le code de la page au complet :

Code:

<?php
include_once(PHPWG_ROOT_PATH.'/include/functions_metadata.inc.php');
$template->assign_block_vars('metadata', array());
if ($conf['show_exif'])
{
  if (!function_exists('read_exif_data'))
  {
    die('Exif extension not available, admin should disable exif display');
  }

  if ($exif = @read_exif_data($picture['current']['src_file_system']))
  {
    $template->assign_block_vars(
      'metadata.headline',
      array('TITLE' => 'EXIF Metadata')
      );

    foreach ($conf['show_exif_fields'] as $field)
    {
      if (strpos($field, ';') === false)
      {
        if (isset($exif[$field]))
        {
          $key = $field;
          $champ = $field;
          if (isset($lang['exif_field_'.$field])) $key = $lang['exif_field_'.$field];
          $value = $exif[$field] ;
          if ($champ==='Make') $value.=' '.$exif['Model'];
          else if ($champ==='FocalLength') {
            $value = compute_fraction($value) ;
            $value.='mm';
          } else if ($champ==="ExposureTime") {
            $value = compute_fraction($value) ;
            if ($value<1) {
              $value=1/$value ;
              $value="1/".$value ;
            }
            $value.="s";
          } else if ($champ==='ExposureBiasValue') {
            $value = compute_fraction($value) ;
            if ($value>0) $value='+'.$value;
            $value.=' EV';
          } else if ($champ==='ExposureProgram') {
            $sct = $exif['SceneCaptureType'];
            $value='' ;
            if ($sct>2) $value=$sct.' ';
            $exp = $exif['ExposureProgram'];
            switch($exp) {
              case 0: if ($sct===0) $value='Bougie' ; else $value='?'; break;
              case 1: $value.='M'; break;
              case 2: $value.='P'; break;
              case 3: $value.='A'; break;
              case 4: $value.='S'; break;
              case 5: $value.='Plage'; break;
              case 6: $value.='Sport'; break;
              case 7: $value.='Portrait'; break;
              case 8: $value.='Paysage'; break;
              default: $value.='Autre ('.$exp.')' ; break;
            }
          } else if ($champ==='LightSource') {
            switch($value) {
              case 0: $value="Auto"; break;
              case 1: $value="Jour"; break;
              case 2: $value="Fluorescent"; break;
              case 3: $value="Incandescent"; break;
              case 4: $value="Flash"; break;
              case 9: $value="Beau temps"; break;
              case 10: $value="Nuageux"; break;
              case 11: $value="Ombragé"; break;
              case 12: $value="Daylight fluorescent (D 5700 – 7100K)"; break;
              case 13: $value="Day white fluorescent (N 4600 – 5400K)"; break;
              case 14: $value="Cool white fluorescent (W 3900 – 4500K)"; break;
              case 15: $value="White fluorescent (WW 3200 – 3700K)"; break;
              case 17: $value="Standard light A"; break;
              case 18: $value="Standard light B"; break;
              case 19: $value="Standard light C"; break;
              case 20: $value="D55"; break;
              case 21: $value="D65"; break;
              case 22: $value="D75"; break;
              case 23: $value="D50"; break;
              case 24: $value="ISO studio tungsten"; break;
              case 255: $value="Other light source"; break;
              default: $value="Reserved (".$value.")"; break;
            }
          } else if ($champ==='Flash') {
            switch($value) {
              case 0x00: $flash='non'; break;
              case 0x01: $flash='oui'; break;
              case 0x05: $flash='retour ko'; break;
              case 0x07: $flash='retour ok'; break;
              case 0x09: $flash='oui, forcé'; break;
              case 0x0D: $flash='oui, forcé, retour ko'; break;
              case 0x0F: $flash='oui, forcé, retour ok'; break;
              case 0x10: $flash='non, forcé'; break;
              case 0x10: $flash='non, forcé'; break;
              case 0x18: $flash='non, auto'; break;
              case 0x19: $flash='oui, auto'; break;
              case 0x1D: $flash='oui, auto, retour ko'; break;
              case 0x1F: $flash='oui, auto, retour ok'; break;
              case 0x20: $flash='pas de flash'; break;
              case 0x41: $flash='oui, anti yeux rouges'; break;
              case 0x45: $flash='oui, anti yeux rouges, retour ko'; break;
              case 0x47: $flash='oui, anti yeux rouges, retour ok'; break;
              case 0x49: $flash='oui, forcé, anti yeux rouges'; break;
              case 0x4D: $flash='oui, forcé, anti yeux rouges, retour ko'; break;
              case 0x4F: $flash='oui, forcé, anti yeux rouges, retour ok'; break;
              case 0x59: $flash='oui, auto, anti yeux rouges'; break;
              case 0x5D: $flash='oui, auto, anti yeux rouges, retour ko'; break;
              case 0x5F: $flash='oui, auto, anti yeux rouges, retour ok'; break;
              default: $flash='Reserved'; break;
            }
            $value=$flash.' ('.dechex($value).')';
          }

          $template->assign_block_vars(
            'metadata.line',
            array(
              'KEY' => $key,
              'VALUE' => $value
              )
            );
  }
}


?>

Pour la ligne 157, il s'agit dans le cas présent de la fin de page : "?>"

Hors ligne

#15 2006-09-07 17:27:36

phgiraud
Membre
2006-08-23
37

Re: Présentation des infos EXIF

il manque des accolades fermantes à la fin:

Code:

[...]
          $template->assign_block_vars(
            'metadata.line',
            array(
              'KEY' => $key,
              'VALUE' => $value
              )
            );
        }
      }
    }
  }
}


?>

Hors ligne

Pied de page des forums

Propulsé par FluxBB

github twitter newsletter Faire un don Piwigo.org © 2002-2024 · Contact