problème avec exec et exiftool pour une seule image

4 réponses
Avatar
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.

4 réponses

Avatar
Pierre Maurette
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
Avatar
Une Bévue
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...
Avatar
Une Bévue
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...
Avatar
Une Bévue
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...