Photos verticales
Cette page à pour but de noter un peu tout ce que je sais sur la gestion de photos verticales.
En effet, je n'ai pas encore tout compris, le comportement est parfois étrange.
En gros, depuis toujours on fait des photos qui ne sont pas carrées ! Donc suivant le sens dans lequel on tourne l'appareil photo, une photo est horizontale ou verticale.
Le plus souvent on fait des photos horizontale vu que notre vision humaine est panoramique. Donc la référence largeur hauteur est basée sur cette vision horizontale.
Donc on peut dire que:
- une photo horizontale est une photo qui a une largeur plus grande que la hauteur. (l>h)
- une photo verticale est une photo qui a une largeur plus petite que la hauteur. (l
Jusque là tout le monde est d'accord.
En argentique, on a une film qui dispose d'une surface sensible à la lumière. Cette surface est toujours orientée de la même manière. Il n'est possible de faire que des photos horizontales.
Au moment de développer et tirer les photos, on utilise le même papier et le même traitement de fait sur toutes les photos.
Au moment de regarder sa pile de photo sur papier, on retourne instinctivement chaque photo pour voir les verticales dans le bon sens. Pas de problème.
En numérique. Une photo c'est un assemblage de pixel qui correspondent à la lumière enregistrée par un capteur. Comme le film, le capteur est fixe. Il prend toujours les photos en horizontal.
Puis les photos sont transférée de la mémoire de l'appareil photo à la mémoire d'un ordinateur. Au moment de regarder les photo sur un ordinateur, les photos sont toute dans le même sens: horizontale. Donc pour regarder les photos, comme avec la pile de photo papier on retourne la photo.
Pour simplifier un visionnage ultérieur des photos, il est possible d'enregistrer le sens dans lequel est la photos. Pour ce faire, il y a 2 méthodes:
- définitivement ré-ordonner les donnée de la photo pour qu'elle s'affiche avec des dimension différente et donc une orientation différente.
- placer une information dans le fichier qui dit au logiciel de retourner la photo au moment de l'afficher.
Historiquement c'est la première méthode qui est la plus courante. Elle demande des ressources une fois et pas à chaque affichage pour retourner la photo. C'est la méthode traditionnelle. Elle a pour inconvénients de devoir réécrire un fichier existant, et cette manipulation est souvent source de problème de perte d'information.
En effet, actuellement, il y a de plus en plus de méta-données dans une photo et le risque de les perdre est grand suivant les logiciels utilisé pour réécrire les images. De plus, la qualité est souvent difficile à régler.
La seconde méthode tend à se répendre de plus en plus. En effet, nous avons des machines rapides qui arrivent facilement à retourner les photos à la volée au moment de l'affichage.
Mais surtout, ce sont les appareils photos numériques qui se sont perfectionnés. De plus en plus, ceux-ci sont équipés d'un capteur de position qui permet d'indiquer l'orientation d'une photo directement dans le fichier au moment de sa création. L'appareil photo est, par rapport à l'ordinateur qui va afficher l'image, un ordinateur lent. Il est donc plus facile pour l'appareil photo d'écrire une indication sur l'orientation de l'image que de ré-ordonner complètement les données de la photos pour la retourner.
Ainsi, il existe dans les photos, des méta-données, des données sur des données... Pour les caractéristiques techniques c'est la norme EXIF qui est utilisée. C'est un format dans lequel chaque appareil photo va enregistrer les réglages et les conditions dans lesquelles la photos est prise.
L'orientation de la photo est donc enregistrée dans un des champs de données exif le champ: orientation.
D'après les spécifications EXIF, le champ orientation contient une valeur numérique de 1 à 8. La signification explique suivant cette valeur, où se trouve visuellement dans l'image le début des donnée à la ligne 0 et colonne 0, donc le haut à gauche. Le cas horizontal normal correspond à la valeur 1.
- la ligne 0 est visuellement en haut de l'image, et la colonne 0 est visuellement à gauche de l'image.
- la ligne 0 est visuellement en haut de l'image, et la colonne 0 est visuellement à droite de l'image.
- la ligne 0 est visuellement en bas de l'image, et la colonne 0 est visuellement à droite de l'image.
- la ligne 0 est visuellement en bas de l'image, et la colonne 0 est visuellement à gauche de l'image.
- la ligne 0 est visuellement à gauche de l'image, et la colonne 0 est visuellement le haut de l'image.
- la ligne 0 est visuellement à droite de l'image, et la colonne 0 est visuellement le haut de l'image.
- la ligne 0 est visuellement à droite de l'image, et la colonne 0 est visuellement le bas de l'image.
- la ligne 0 est visuellement à gauche de l'image, et la colonne 0 est visuellement le bas de l'image.
Là ça devient difficile de comprendre le nombre de possibilité. Mais en fait, ça doit tout simplement être, j'ai mon appareil et je le tourne dans un sens avec 4 positions et dans l'autre sens avec 4 positions. Mais il me semble qu'il y a des positions qui sont équivalentes ? Là il me faudrait étudier plus en détail ce que représente les colonnes et lignes.
En simplifiant, ce qu'il faut retenir:
- 1 = le coin référence ligne 0 colonne 0 est en haut à gauche de la photo. (c'est la position standard horizontale)
- 8 = le coin référence ligne 0 colonne 0 est en bas à gauche de la photo. (il faut incliner la tête à droite pour voir la photo)
- 6 = le coin référence ligne 0 colonne 0 est à droite en haut de la photo. (il faut incliner la tête à gauche pour voir la photo)
Les autres position n'arrive pas souvent... je tiens rarement mon appareil photo à l'envers.. et il y a même des positions que je ne comprends pas vraiment !
Donc on va s'en tenir à ce qui est le plus courant. Si je résume, mon logiciel quand il va lire les infos, il doit se dire: je lis la balise exif orientation, si je vois un 1, je ne fait rien de spécial, si je vois un 8 je fais une rotation dans le sens trigonométrique et si je vois un 6 je fais une rotation dans le sens des aiguilles d'une montre.
Détail de la signification des nombres
d'après.. http://owl.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html
- = Horizontal (normal)
- = Mirror horizontal
- = Rotate 180
- = Mirror vertical
- = Mirror horizontal and rotate 270 CW
- = Rotate 90 CW
- = Mirror horizontal and rotate 90 CW
- = Rotate 270 CW
Maintenant que la théorie est posée, comment se passe la réalité ?
Sur Mac OSX, les applications suivantes comprennent ces balises de rotation:
- Aperçu
- GraphicConverter
- photoshop
Mais, le plus ennuyeux, quelles sont les applications qui ne comprennent pas:
- Safari
- Firefox
- ... en bref... les navigateurs web.
- indesign
iPhoto, comme expliqué plus bas est un logiciel qui comprend cette balise, mais qui ne veut pas l'utiliser !!! En effet, chaque photo avec une indication exif de l'orientation qui est différente de 1 est réécrite dans une version nativement dans le bon sens.
Sur le web, certainement pour des raisons historiques, les photos sont interprétées de manière brut. On ne tient pas compte des balises.
Automator
Automator permet d'effectuer nombre d'opération en piochant par ci par là dans les applications installées.
GraphicConverter propose plusieurs fonctions. Donc la fameuse rotation jpg sans perte de qualité. En sélectionnant cette fonction, il y a un message qui apparaît: Dans la mesure ou la rotation sans perte réécrit les données EXIF de l'image, vous ne pourrez plus afficher des images ainsi modifiées sur un appareil photo numérique.
Ce message sous entend que ce sont principalement les donnée Exif qui sont modifiées... donc est-ce juste la modification de la balise orientation ??? Réponse après le test:
Réponse... le fichier est bel et bien retourné.. mais c'est une rotation effective des données qui est réalisée! Malgré le message, d'avertissement je n'ai vu aucune modification dans l'exif ! Ce sont les données qui ont été réécrites. Les Méta-données IPTC et exif sont inchangées. Les mots-clés sont gardés et avec les accents. Les ressources ont été vidée, l'aperçu n'est plus là !
Le comportement est quasi identique avec le module d'aperçu: pivoter des images . Le fichier est réécrit et la balise exif orientation n'est pas changée.
Aperçu
Comment se comporte aperçu lorsqu'on lui demande d'ouvrir un photo de lui faire faire une rotation et de sauver le fichier. Réponse:
Aperçu effectue des rotations qui sont une modification de la balise exif orientation. Cependant, au moment de sauver, il réécrit la photo avec des paramètres par défaut. L'IPTC et l'exif sont conservés, mais le fichier a été dans mon cas réécrit et les données sont passées de 1012ko à 720k, au moment de sauver, Aperçu n'est pas capable de sauver uniquement l'exif, il sauve et donc recompresse avec les réglages courants. Pourquoi réécrire toute la photo si seul un champ exif est modifié bouh !
GraphicConverter
Essai de rotation en mode standard, manuel. L'image de base se retourne en mode natif, la balise orientation n'est pas touché. La photos est sauvegardée aux paramètres courants. Le hic, c'est que les mots-clé iptc avec accents se sont fait écrasés, l'encodage n'est vraissemblablement pas le même ! C'est étrange, car le module de rotation sans perte de qualité de GC qui est dans automator ne massacre pas les mots-clés accentuées !!
Si l'on prend une photo qui comporte une orientation, et que je fais sauver sous, elle reste identique. rien ne change. Si je prend la même photos, que je bidouille avec des outils (juste la sélection pour ne rien toucher) et que je sauve la photo. GC la réécrit, et cette fois elle est réécrite verticalement. Les informations EXIF sont réécrite, le champ orientation passe de 8 à 1. Et le champ datetime est mis au temps courant. Il ne reste donc plus que original date time pour savoir le moment de prise de vue.
GC en mode gestionnaire: ce mode comporte des réglage qui peuvent être différents, et c'est le mode que j'utilise le plus, alors voyons comment il se comporte.
Pour une photo qui comporte une balise exif orientation égale à 6, si l'on veut la diffuser sur le web, il faut la redresser en faisant une rotation de 90° dans le sens des aiguilles d'une montre. En effectuant cette manipulation à l'aide du gestionnaire d'image de GC, l'image est véritable retournée en donnée et le champ exif orientation reste inchangé. Cette opération ajoute une incohérence. Les logiciels comprenant la rotation exif à la volée tourne inutilement la photo. Par contre sur le web, c'est tout bon. Les méta-données EXIF et IPTC ne sont pas touchée. Ceci par ce que le gestionnaire est configuré pour utiliser une rotation sans perte et ne pas toucher les champs exif. (fait étrange remarqué, dans le gestionnaire, la vignette est aussi retournée mais dans l'autre sens !?!)
Lors d'un second essai, mais avec un photo dans l'autre sens (et des mots-clés iptc accentués) l'image a aussi été tournée, mais pas la vignette !! Les mots-clés sont restés identique.
Maintenant, essai, avec la même photo source, mais dans les préférences l'option ne pas modifier l'exif n'est pas cochée. Le comportement est bien mais pas top ! L'image est véritablement retournée, l'exif est modifié (ou plutôt pollué.. je vois pas à quoi sert de le modifier, l'exif est surtout utile pour avoir les conditions du moment de prise de vue.) L'exif est modifié, mais pas le champ orientation !!! ce qui est un peu débile, car sinon, pourquoi avoir besoin de modifier l'exif !
En ce qui concerne l'option rotation sans perte de qualité je ne dois pas encore avoir tout compris. Moi je vois dans tout les cas que le fichier est réécrit ! Si le même fichier est retourné dans un sens puis dans l'autre, on retombe sur nos patte (?) mais sinon, la compression effectuée par l'appareil photo et celle refait diffèrent quelque peu !
L'ajout de mots-clés dans un fichier via le gestionnaire semble être bien fait, il ne modifie que les champs exif. Avec l'option ne pas modifier l'exif desactivé. (donc GC a le droit de modifier l'exif) Si j'ajoute 20 caractères comme mots-clés, je vois le fichier grossir de 28 octet. Ce qui restent dans le bon ordre de grandeur. Bien.
iPhoto
Comment ça fonctionne tous ça !!! Version 6.0.6 (ouais chez apple cette applications change beaucoup à chaque fois.) Dans mon cas, je prend mon dossier de photos d'essai que je glisse sur l'icon de iPhoto. A ce moment, iPhoto turbine et j'ai une nouvelle sélection dans la photothèque qui comprend mes photos. Par soucis de propreté, je crée un nouvel album, avec la sélection courante de mes dernières photo. Puis en allant explorer le dossier iPhoto Library, je remarque que les photos sont triées dans 3 dossiers, Data , Modified, et Originals. Data contient les vignettes des photos. Modified contient toutes les photos qui ont été modifiées, c'est à dire qu'une photo verticale qui contient juste le champs exif orientation est réécrite en mode vertical natif. La photo est donc modifiée et se retrouve dans ce dossier. Le plus grave dans l'histoire, c'est les dégâts collatéraux. L'exif est très réduit. Il ne reste que quelques rares champs, comme la date de prise de vue originale (heureusement) et l'IPTC est carrément shooté !. Originals contient des alias sur les photos originales. C'est également le seul liens qu'iphoto a avec les photos horizontales qui n'ont pas été modifiées. Donc, dans ce mode la photothèque est en partie en interne au dossier d'iphoto et en partie en externe !!
Le boulot de massacre des photos est assez bien fait, en effectuant une rotation effective des photos, iphoto ajoute une balise exif orientation. Mais s'il en existe déjà une, il ne la modifie pas, non... il ajoute. Ce qui fait que l'exif est endommagé, certains programmes n'arrivent plus le lire! (la fonction php read_exif_data par exemple) Donc, il y a 2 balises orientation. Génial pour tout compliquer.
De plus, le fichier réécrit est plus lourd que l'original. (1.6Mo passe à 2Mo)
Quand iphoto passe en mode édition, un nouveau fichier est créé dans le dossier modified, même quand ce n'est que de la visualisation en plein écran !!!
Lorsque les mots-clés IPTC des photos non modifiées existes, iPhoto est capable de les reprendre pour les utiliser dans sa propre base de données. Sinon, les mots-clés ne sont pas exporté hors de iphoto. Heureusement qu'un module spotlight permet de rechercher aussi dans iphoto, mais cette méthode rend captif l'utilisateur dans ce logiciel qui comme on vient de l'étudier n'est de loin pas parfait, et même plutôt destructeur d'image !
Malheureusement, aucune modification du côté de la version 7.1 de iPhoto ! ... l'interface, s'améliore, mais le moteur n'a pas changé du tout !
PictureSync
PictureSync est un logiciel qui est conçu pour automatiser l'envoi de photo depuis iphoto, aperture, ou un dossier, vers le divers services de photo comme flickr, zoomr, ou en dossier etc....
Ce logiciel est capable de lire un grand nombre d'information exif. L'application est capable de faire des rotations. et surtout de voir le champs orientation et d'agir en conséquence. Lorsque PictureSync fait une rotation, il lit le champ orientation, effectue la rotation et modifie le champs orientation !!! C'est le seul logiciel que je connaisse qui prenne la peine de le faire ! Bien! (le seul bémol est une désaturation des couleurs lors de l'opération !)
PictureSync est conçu pour uploader des photo (sur un site ou dans un dossier) et est capable de faire la rotation et le redimensionnement des photo à la volée au moment de l'upload. Il semble que pour ma photo que j'avais déjà triturée (rotation), tout se passe bien. Pour les photos brut, c'est moins bien, le logiciel me signal une erreur de réécriture de l'exif ! (problème d'accès du dossier de destination ?) Suite à ce problème, j'ai perdu les métadonnées. Demande encore quelques essais !
Sinon, le logiciel permet d'éditer bon nombre de champs de méta-données, ce qui est très intéressant. Il y a également la possibilité de faire du géotagging avec google earth. Intéressant !
Créer une galerie web
Mon intérêt pour ce problème de rotation des photos viens surtout d'une application en particulier qui me pose problème. La création de galerie de photo pour le web.
En effet, j'ai développé une galerie de photo en php qui récupère les mots-clés IPTC dans le but de les afficher comme légende ou titre. De plus cette galerie permet de trier les photos en fonction de leur date de prise de vue qui se trouve dans les données EXIF.
Les photos que je dépose sur le web sont donc soumise à quelques contraintes:
- l'exif doit être conservé
- l'IPTC doit être conservé
- les mots-clés IPTC doivent être encodé en UTF-8
- les photos verticales doivent être nativement tournée. Le champ exif orientation n'est pas compris par les navigateurs web.
Pour afficher des photos sur le web, je ne les mets jamais en plein résolution, ce serait trop gros. J'ai donc besoin de réduire la taille des photos tout en ne perdant pas les méta-données. De plus, j'ai besoin de retourner en mode natif donnée les photos verticales qui ne comporte que l'indication du champ exif orientation.
Ceci parait simple, mais c'est finalement un casse tête! Et cela se complique encore plus, quand comme je le fais, la sélection de photo a traiter est une liste d'alias. (c'est ainsi que je me fais des albums, des sélections de différents fichier du lot de base.)
Questions...
Dans le cas d'un appareil photo qui n'a pas de capteur de position, est ce que la fonction rotation de l'image de l'application transfert d'image fait une rotation véritable ou est ce qu'elle renseigne la balise exif orientation?
Fonction php pour retourner une photo jpg en fonction du flag exif orientation
/* Retourne les données d'une photo jpg en fonction du flag exif orientation.
*
* Utilise jpgetran pour la rotation sans perte de la photo
* Utilise exiftool pour modifier le flag exif orientation après avoir effectué la rotation. http://www.sno.phy.queensu.ca/~phil/exiftool/
*
* Cette fonction effectue une rotation sans perte. Les données sont réarrangée, mais pas recompressée.
* Cette fonction conserve les métadonnées. (exif, iptc, commentaires, jffif, xmp, etc..)
* Cette fonction ne retourne PAS la vignette exif. Elle reste dans la position originale. Cela influence la vue des vignettes dans graphicConverter, l'aperçu en mode colonne du finder.
* Cette fonction recrée un fichier, donc elle modifie la date de création et modification du fichier. (c'est à cause de jpegtran. Exiftool est souple à ce niveau)
*
* Les commandes utilisées sont sur le principe:
* jpegtran -copy all -rotate 270 -verbose -outfile girafe2.jpg girafe.jpg
* exiftool -orientation=1 -n -overwrite_original_in_place girafe.jpg
*
* @return: rien de particulier.. 😛
* @param: $imagePath => le chemin d'accès de la photo sur le serveur. (pas une url)
*/
function rotateJpgFromExifOrientation($imagePath){
// lire le champ exif orientation
$exif = exif_read_data($imagePath); // todo: bug quand exif n'est pas là... Warning: exif_read_data(dsc_1783.jpg) [exif_read_data]: Process tag(x0000=UndefinedTa): Illegal pointer offset(x4E20434F + x4E494B4F = x9C698E9E > x02C3) in /Users/mdespont/Sites/yopyop/include/manager/photoManager.php on line 468
if ($exif!=false) {
$orientation = ''; // pour tout les cas non prévu, ou la cas orientatio=1 qui ne demande pas de modification.
$orientation = $exif['Orientation'];
// si orientation = 8 => retourne de 270
if ($orientation=='8') {
$angle = "270";
// si le champ = 6 => retourne de 90
}elseif ($orientation=='6') {
$angle = '90';
}else {
$angle = '';
}
if (!empty($angle)) {
$nomDossier = dirname($imagePath); // obtient le nom du dossier. Ex: images/photos/2006/toto/toto.jpg devient images/photos/2006/toto
$nomFichier = basename($imagePath);
$outpoutPath = $nomDossier."/temp_".$nomFichier;
// retourne la photo
$commandeRotation = "/usr/local/bin/jpegtran -copy all -rotate ".$angle." -outfile ".$outpoutPath." ".$imagePath; // on suppose que jpegtran est dans le path
// echo "
commande rotation: ", $commandeRotation;
$output = array();
$return_var = 0;
exec($commandeRotation, $output, $return_var);
// print_r($output);
// echo "statut: ",$return_var;
// place le flag orientation à 1. Ce qui signifie que le flux de donnée est correct. Pas besoin de modifier l'orientation à la volée
// cette option ne sert à rien pour le site web en lui même, mais elle est utile si des gens téléchargent les photos depuis le site web pour les utiliser en local.
$commandeFlagExif = "/usr/bin/exiftool -orientation=1 -n -overwrite_original_in_place ".$outpoutPath; // -overwrite_original_in_place permet de garder l'icon et les ressources Mac. Si on est sur linux, utiliser: overwrite_original qui est moins gourmand
// echo "
commande flag: ", $commandeFlagExif;
$output = array();
$return_var = 0;
exec($commandeFlagExif, $output, $return_var);
// print_r($output);
// echo "statut: ",$return_var;
// renommer le fichier temp_photo.jpg en photo.jpg
rename($outpoutPath,$nomDossier."/".$nomFichier);
}
}
}