Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > fr.comp.lang.php > #2948 > unrolled thread

problème avec exec et exiftool pour une seule image

Started byUne Bévue <unbewusst.sein@fai.invalid>
First post2016-12-13 13:09 +0100
Last post2016-12-16 11:19 +0100
Articles 5 — 2 participants

Back to article view | Back to fr.comp.lang.php


Contents

  problème avec exec et exiftool pour une seule image Une Bévue <unbewusst.sein@fai.invalid> - 2016-12-13 13:09 +0100
    Re: problème avec exec et exiftool pour une seule image Pierre Maurette <maurette.pierre@free.fr> - 2016-12-15 17:34 +0100
      Re: problème avec exec et exiftool pour une seule image Une Bévue <unbewusst.sein@fai.invalid> - 2016-12-15 19:11 +0100
        Re: problème avec exec et exiftool pour une seule image Une Bévue <unbewusst.sein@fai.invalid> - 2016-12-15 19:13 +0100
      Re: problème avec exec et exiftool pour une seule image Une Bévue <unbewusst.sein@fai.invalid> - 2016-12-16 11:19 +0100

#2948 — problème avec exec et exiftool pour une seule image

FromUne Bévue <unbewusst.sein@fai.invalid>
Date2016-12-13 13:09 +0100
Subjectproblème avec exec et exiftool pour une seule image
Message-ID<o2oodo$ui8$1@shakotay.alphanet.ch>
Bonjour,

Dans un dossier, j'ai plusieurs images :
$ ls -al '/Users/yt/Sites/tests/Flipping_image/photos/'
total 4848
drwxr-xr-x  10 yt  staff   340B 13 déc 09:46 .
drwxr-xr-x  10 yt  staff   340B 13 déc 07:48 ..
-rw-r--r--   1 yt  staff   1,1M 12 déc 10:01 20161202_085945.jpg
-rw-r--r--   1 yt  staff    66K 13 déc 08:10 Cirques.jpg
-rw-r--r--   1 yt  staff   662K 13 déc 08:27 Cirques.png
-rw-r--r--   1 yt  staff   541K  6 déc 13:43 IMG_3130.JPG

qui ont donc même use:group et mes droits "-rw-r--r--".

je dois lire les dats exif de ces images, pour cela j'utilise :

   $cmd = "$EXIFTOOL " . $data['PATH'];
   exec($cmd, $Infos, $ExitStatus);
   foreach($Infos as $line) {
     $fields = explode(' : ', $line, 2 );
     if(count($fields) == 2) {
       $data[rtrim($fields[0])] = $fields[1];
     }
   }
   $data['ExitStatus'] = $ExitStatus;

pour les trois images :
Cirques.jpg
Cirques.png
IMG_3130.JPG

j'ai les bonnes infos, du genre :
{
   "ExifTool Version Number":  "10.20",
   "File Name":  "IMG_3130.JPG",
   "Directory":  "\/Users\/yt\/Sites\/tests\/Flipping_image\/photos",
   "File Size":  "541 kB",
   [...]
   "Hyperfocal Distance":  "1.82 m",
   "Light Value":  "4.0",
   "ExitStatus":  0
}

MAIS, pour l'image :
20161202_085945.jpg
mon script ne donne rien en sortie...
je ne vois pas pourquoi d'autant qu'au terminal, par un :
$ exiftool /Users/yt/Sites/tests/Flipping_image/photos/20161202_085945.jpg
j'obtiens des données correctes.

est-ce que ça pourrait provenir de la taille de l'image ?
ici 1,1Mo

je n'ai pas d'erreur, dans mon php.ini, j'ai :
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

et ma version de php est 5.6.25 sur macOS Sierra.

Au cas où vous auriez une indication surtout sur comment chercher ce 
problème.

[toc] | [next] | [standalone]


#2949

FromPierre Maurette <maurette.pierre@free.fr>
Date2016-12-15 17:34 +0100
Message-ID<mn.7c1e7e0c0b029871.79899@free.fr>
In reply to#2948
Une Bévue :
> Bonjour,
>
> Dans un dossier, j'ai plusieurs images :
> $ ls -al '/Users/yt/Sites/tests/Flipping_image/photos/'
> total 4848
> drwxr-xr-x  10 yt  staff   340B 13 déc 09:46 .
> drwxr-xr-x  10 yt  staff   340B 13 déc 07:48 ..
> -rw-r--r--   1 yt  staff   1,1M 12 déc 10:01 20161202_085945.jpg
> -rw-r--r--   1 yt  staff    66K 13 déc 08:10 Cirques.jpg
> -rw-r--r--   1 yt  staff   662K 13 déc 08:27 Cirques.png
> -rw-r--r--   1 yt  staff   541K  6 déc 13:43 IMG_3130.JPG
>
> qui ont donc même use:group et mes droits "-rw-r--r--".
>
> je dois lire les dats exif de ces images, pour cela j'utilise :
>
>    $cmd = "$EXIFTOOL " . $data['PATH'];
>    exec($cmd, $Infos, $ExitStatus);
>    foreach($Infos as $line) {
>      $fields = explode(' : ', $line, 2 );
>      if(count($fields) == 2) {
>        $data[rtrim($fields[0])] = $fields[1];
>      }
>    }
>    $data['ExitStatus'] = $ExitStatus;
>
> pour les trois images :
> Cirques.jpg
> Cirques.png
> IMG_3130.JPG
>
> j'ai les bonnes infos, du genre :
> {
>    "ExifTool Version Number":  "10.20",
>    "File Name":  "IMG_3130.JPG",
>    "Directory":  "\/Users\/yt\/Sites\/tests\/Flipping_image\/photos",
>    "File Size":  "541 kB",
>    [...]
>    "Hyperfocal Distance":  "1.82 m",
>    "Light Value":  "4.0",
>    "ExitStatus":  0
> }
>
> MAIS, pour l'image :
> 20161202_085945.jpg
> mon script ne donne rien en sortie...
> je ne vois pas pourquoi d'autant qu'au terminal, par un :
> $ exiftool /Users/yt/Sites/tests/Flipping_image/photos/20161202_085945.jpg
> j'obtiens des données correctes.
>
> est-ce que ça pourrait provenir de la taille de l'image ?
> ici 1,1Mo
>
> je n'ai pas d'erreur, dans mon php.ini, j'ai :
> error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
>
> et ma version de php est 5.6.25 sur macOS Sierra.
>
> Au cas où vous auriez une indication surtout sur comment chercher ce 
> problème.

C'est bizarre, votre truc.

La première chose à voir, c'est la taille de l'image, pas son poids. En 
effet, c'est un problème courant, les fonctions de base de traitement 
d'images jpeg qui sont pratiquement incontournables commencent par 
créer en mémoire un bitmap pouvant héberger l'image. Et généralement 
*en php*, c'est là que ça saute. Ça doit également mal se passer, en 
mutualisé par exemple, quand la mémoire est comptée.
La fonction de base dispose d'une option qui permet de mapper la 
mémoire sur le disque au-dessus d'une certaine valeur, et cette option 
est relayée par certains programmes. Voyez pour exiftool ce qu'il en 
est.

Mais ceci n'explique rien dans votre cas. Votre contexte mémoire est-il 
différent entre un terminal et exec() ? J'ai tendance à penser non, 
mais pourtant...

Vous pourriez essayer de lancer un script qui appelle exiftools et 
écrit le résultat sur le disque, puis lire ce résultat. Si vous pouvez 
faire à la main:
exiftool bla/bla.jpg > temp.txt
et que vous ne pouvez pas exécuter un script avec cette seule ligne 
depuis php, ça vous donnera au moins une indication.

-- 
Pierre Maurette

[toc] | [prev] | [next] | [standalone]


#2950

FromUne Bévue <unbewusst.sein@fai.invalid>
Date2016-12-15 19:11 +0100
Message-ID<o2umcd$l7p$1@shakotay.alphanet.ch>
In reply to#2949
Le 15/12/2016 à 17:34, Pierre Maurette a écrit :
> C'est bizarre, votre truc.

oui, j'ai +/- trouvé le pb, il semblerait qu'un (et un seul caractère) 
pose problème, c'est le ® (Pour Photoshop TradeMark) il doit-être encodé 
en Latin1 d'où le ? dans un carré au terminal.

l'ennui pour moi, c'est que ce truc me semble scpécifique à ce téléphone 
mobile.

pour un iPhone, ou mon nikon, je n'ai jamais rencontré ce pb.

peut-être une solution, pour moi, serait de détecter la marque et le 
modèle de l''appareil et de faite un -charset=<encodage qui va bien> en 
fonction de la marque et du modèle.

car, si je ne lis pas le Comment pour cette photo-là, c'est bon.

Donc j'ai déjà changé mon script php pour ne lire que ce qui 
m'intéresse, ce qui me donne des options à rallonge :

$SHORT_INFOS = array();
$SHORT_INFOS['XMP'] = ['Lens'];
$SHORT_INFOS['EXIF'] = explode(' ', 'Make Model ExposureTime FNumber ISO 
FlashMode FocalLength UserComment');

$LONG_INFOS = array();
$LONG_INFOS['File'] = explode(' ', 'FileName Directory FileSize 
ImageWidth ImageHeight');
$LONG_INFOS['XMP'] = ['Lens'];
$LONG_INFOS['EXIF'] = explode(' ', 'Make Model Orientation XResolution 
YResolution ExposureTime FNumber ISO CreateDate FocalLength UserComment 
ExposureMode WhiteBalance GPSVersionID GPSLatitudeRef GPSLongitudeRef 
GPSAltitudeRef GPSTimeStamp GPSSpeedRef GPSSpeed GPSImgDirectionRef 
GPSImgDirection GPSDestBearingRef GPSDestBearing GPSDateStamp 
GPSHPositioningError GPSAltitude GPSDateTime GPSLatitude GPSLongitude 
GPSPosition');
$LONG_INFOS['MakerNotes'] = explode(' ', 'ImageBoundary Timezone 
DaylightSavings LensType Lens FlashMode ShootingMode');



$data['short_options'] = getOptions($SHORT_INFOS);
$data['long_options'] = getOptions($LONG_INFOS);

avec "getOptions" qui fabrique les options :
function getOptions($tab) {
   $out = ' ';
   foreach ($tab as $key => $fields){
       foreach($fields as $field) {
         $out .= "-$key:$field ";
       }
   }
   return $out;
}


ce qui me paraît vraiment bizarre et que l'exec ne retourne pas 
d'exitstatus, ça hang indéfiniment...

j'ai perdu pas mal de temps sur ce truc inutile...

[toc] | [prev] | [next] | [standalone]


#2951

FromUne Bévue <unbewusst.sein@fai.invalid>
Date2016-12-15 19:13 +0100
Message-ID<o2umfl$l7p$2@shakotay.alphanet.ch>
In reply to#2950
Le 15/12/2016 à 19:11, Une Bévue a écrit :
> peut-être une solution, pour moi, serait de détecter la marque et le
> modèle de l''appareil et de faite un -charset=<encodage qui va bien> en
> fonction de la marque et du modèle.

ce qui nécessiterait deux passes d'exxiftool, une pour lire marque et 
modèle et l'autre pour corriger le tir...

[toc] | [prev] | [next] | [standalone]


#2952

FromUne Bévue <unbewusst.sein@fai.invalid>
Date2016-12-16 11:19 +0100
Message-ID<o30f34$8uk$2@shakotay.alphanet.ch>
In reply to#2949
Le 15/12/2016 à 17:34, Pierre Maurette a écrit :
> Vous pourriez essayer de lancer un script qui appelle exiftools et écrit
> le résultat sur le disque, puis lire ce résultat. Si vous pouvez faire à
> la main:
> exiftool bla/bla.jpg > temp.txt
> et que vous ne pouvez pas exécuter un script avec cette seule ligne
> depuis php, ça vous donnera au moins une indication.

quelqu'un a regardé l'encodage pour moi, c'est MacRoman ***uniquement*** 
pour le caractère ® représenté par � (codé par A8 dans le fichier photo) 
sur mon terminal qui marche en UTF-8.

avec exiftool j'ai essayé de changer l'encodage interne en MacRoman par :

  -charset exif=MacRoman
  -charset iptc=MacRoman
  -charset id3=MacRoman
  -charset photoshop=MacRoman
  -charset quicktime=MacRoman

(successivement)

(conseil d'Olivier Miakinen)

mais ça n'a rien changé.

je n'ai donc pas de solution, mise à part ne pas lire le champs Comment...

[toc] | [prev] | [standalone]


Back to top | Article view | fr.comp.lang.php


csiph-web