GpsExif.dll

v1.1.0 béta-3

http://geotag.zissler.org

freeware

 

SOMMAIRE

 

   suite ...

 

GENERALITES

 

GpsExif est une DLL permettant de lire et écrire les coordonnées et Dates dans les Tags (= champs) EXIF/GPS des photos Jpeg ; système géodésique RDF93=WGS84 et sa projection UTM. L'écriture des tags se fait sans dégradation de l'image. Les coordonnées initiales en big-endian (Motorola) sont récrites en little-endian (Intel).

Un mode dit "Batch" permet de traiter des lots de photos à partir de listes NMEA ou de listes de POINTS (Écriture Lat/Lon et UTM).

La DLL est native .NET, compatible COM. C'est à dire qu'on peut l'utiliser soit avec Vbnet, C# et C++.Net soit avec VB6, C++, ... La compatibilité COM est assurée par le service d'interopérabilité du FrameWork  microsoft (voir Rappels en bas) . Si le FrameWork de Microsoft n'est pas encore installé sur votre PC il faudra impérativement le faire pour pouvoir utiliser GpsExif et les exemples.

 

Télécharger "MS FrameWork v3 Fr"

 

Note importante : Dans la doc qui suit j'explique comment utiliser "GpsExif" : paramétrage de l'IDE, localisation, création de la tlb, positionnement des composants, enregistrements ...ce qui peut paraître un peu fastidieux (en fait c'est assez simple, mais les explications sont détaillées). Dans un premier temps, il me semble préférable de se familiariser avec les exemples, toutes ces opérations étant déjà effectuées par l'installeur (sauf l'install. du frameWork pour ceux qui ne l'aurait pas encore fait).

 

Retour Sommaire

 

UTILISATION - plateforme COM (Vb6, VC++ ..)

 

Système : Windows XP-SP2 (Home ou Pro) + MS FrameWork (V2 ou V3), je n'ai pas essayé avec XP seul , XP-SP1 et le FrameWork 1.

Localisation : Comme tout les composants .Net, 'GpsExif.dll' et sa bibliotèque de types 'GpsExif,tlb' doivent être situées dans le répertoire du programme (MonAppli.exe par ex) et non pas dans 'C:\windows\system32'.

Enregistrement: L'enregistrement des Dll Com natives .net ne se fait pas avec  'Regsrv32.exe' mais avec la commande RegAsm.exe. On tapera donc : 'RegAsm GpsExif.dll'. Si on ne dispose pas du fichier .tlb il faudra ajouter l'option /tlb pour le générer - On fera alors : "Regasm GpsExif.dll  /tlb:GpsExif.tlb. (dans la commande mettre les chemins complets) - Nota: en principe la commande RegAsm.exe se trouve dans le répertoire :  C:\windows \Microsoft.net \FrameWork \v2.0.50727 .

Avec un lDE : Lorsqu'on effectue des développements avec un IDE (Visual Studio avec VB6 par exemple), le répertoire programme est le celui de l'exécutable IDE. Pour VB6 (exécutable Vb6.exe) il faudra donc mettre la DLL et son fichier de types TLB dans le répertoire "C:\Program files\Microsoft visual studio\vb98", puis déclarer la référence 'GpsExif.tlb' dans l'IDE. Attention, la référence doit se faire sur le fichier .tlb et non pas sur le fichier .dll

Application : En contrepartie si on a réalisé une application 'MonAppli.exe' qu'on a positionné dans le répertoire "C:\RepAppli" (chemin d'accès 'C:\RepAppli\MonAppli.exe') il faudra mettre 'GpsExif.dll' (et 'GpsExif.tlb') dans le répertoire de l'application 'C:\RepAppli', puis l'enregistrer avec RegAsm.exe (utiliser l'option /tlb si on ne dispose pas du fichier .tlb). Lors de la livraison à l'utilisateur final, il faudra penser à inclure l'enregistrement de la dll dans l'installation.

Retour Sommaire

 

UTILISATION - plateforme .NET

 

Il n'y a pas de problèmes particuliers. Mettre la dll (sans la tlb, puisqu'on n'utilise pas Com Interop) dans le répertoire bin du projet (ou un autre à votre convenance) et dans l'IDE créer une référence sur la dll.

Retour Sommaire

 

CLASSE COORD, Objet Gxc ( = Coordonnées GPS dans le segment EXif de l'image)

 

Dans 'GpsExif' la classe qui gère les coordonnées GPS s'appelle 'Coord' , l'objet Gxc sera une instance de GpsExif.Coord.

Les exemples ci-dessous sont en VB6 il faudra transposer pour les autres languages

 

Pour une instance 'Gxc' de GpsExif.Coord (classe), on aura

  • Référence dll : GpsExif.tlb (à mettre dans les références de Visual Studio)
  • Déclaration : Dim Gxc as GpsExif.Coord (Private ou public selon le prog
  • Instanciation : Set Gxc = new GpsExif.Coord
    ou Déclar+Instance : Dim Gxc as new GpsExif.Coord
  • Destruction : Set Gxc=nothing

Retour Sommaire

 

CLASSE UTIL, Objet Utl ( = Utilitaires)

 

Dans 'GpsExif' la classe qui gère les utilitaires internes s'appelle 'Util'. Cette classe met à disposition du programmeurs, des méthodes internes à la Dll, qui peuvent, dans certains cas, être intéressantes. Ces méthodes ne sont pas documentées, mais leurs utilisations sont en général assez simples.

  • Déclaration : Dim Utl as GpsExif.Util
  • Instanciation : Set Utl = new GpsExif.Coord
    ou Déclar+Instance : Dim Utl as new GpsExif.Coord
  • Destruction : Set Utl=nothing

Méthodes

 

utl.cvLLtoUTM(Lon, Lat, Zone, Easting, Northing,[withForm])

Conversion des coordonnées Longitude, Latitude WGS84 en coordonnées UTM Easting, Northing, fuseaux 30, 31 et 32.

Lon, Lat, Zone : Type Double en degrés décimaux

Easting, Northing : Type Double, en mètres.

WithForm : Booléen optionnel, true = avec fenêtre, false (défaut) sans fenêtre

 

utl.cvUTMtoLL(Zone, Easting, Northing, Lon, Lat,[withForm])

Conversion des coordonnées  UTM Easting, Northing, fuseaux 30, 31 et 32. en coordonnées Longitude, Latitude WGS84

Lon, Lat, Zone : Type Double en degrés décimaux

Easting, Northing : Type Double, en mètres.

WithForm : Booléen optionnel, true = avec fenêtre, false (défaut) sans fenêtre

 

 

PROPRIETES de la Classe Coord

 

v = Gxc.GetExifVersion

Propriété en lecture seule. Retourne un String donnant la Version Exif de l'image (Tag ExifVersionID)

Cette propriété  doit être utilisée après la méthode Read, sinon elle retourne un string vide ou erroné.

 

v = Gxc.GetGpsVersion

Propriété en lecture seule. Retourne un String donnant le numéro de la Version GPS de l'image (Tag GpsVersionID)

Cette propriété doit être utilisée après la méthode Read, sinon elle retourne un string vide ou erroné.

 

Delta = Gxc.TlocMoinsUtc

Gxc.TlocMoinsUtc = Delta

Propriété en Lecture/Écriture , type Double ; Delta indique en heures, le décalage entre l'heure universelle UTC (Gps) et l'heure locale (Photo). En France le décalage est d'une heure en hiver et 2 heures en été. Permet de compenser éventuellement une erreur de l'appareil photo. Il faut obligatoirement donner ce décalage.

 

Id = Gxc.UtmTagId

Gxc.UtmTagId = Id

Propriété en Lecture/Écriture , type Integer : Numéro d'identification ID du tag destination des Coordonnées Easting et Northing UTM. Ce numéro doit correspondre à un tag Exif, Iptc ou MSXP de Type String (AZT). Par défaut les coordonnées UTM sont écrites/lues dans le Tag XPComments (ID=40092). Il faut manipuler cette propriété avec précautions et faire de nombreux essais.

Par exemple : ImageDescription=270, UserComment=37510. Prendre de préférence des Tags visibles par Windows. On peut même créer un tag spécifique, mais attention de ne pas prendre un numéro de tag existant, il faut prendre en général au-dessus de 50000.

Retour Sommaire

 

METHODES de la Classe Coord

 

Pour une meilleure compatibilité VB6, tous les paramètres sont passés 'par référence'. Il faudra donc utiliser des pointeurs dans les autres languages. Les types 'double' sont des flottants signés de 8 octets

 

ok = Gxc.Read ( FilePath, Lon, Lat, Alt, gDth, xDth, CrdFmt)

Lit les coordonnées et Dates de l'imag

 

FilePath : type string, chemin de l'image.

Lon, Lat, : type Double, coordonnées en degrés décimaux

Alt : type Double, altitude en mètres décimaux

gDth : date et heure GPS au format Exif (String(20) Azt) format : aaaa:mm:jj hh:mm:ss chr(0)

xDth : date et heure EXIF au format Exif

crdFmt : type string, format des coordonnées dans le segment Exif.

 

Retourne ok : boolean, vrai si succès, faux si échec

 

Remarque: DateHeure EXIF    =   Tag 36867, DateTimeOriginal

                    DateHeure GPS     =   Tag 7, GpsDateStamp + Tag 29 GpsTimeStamp

Attention dans DateHeureGPS l'heure est universelle (UTC) alors que dans DateHeureEXIF l'heure est locale.

DateHeureEXIF est l'heure du cliché, renseignée par l'appareil photo, et ne devra pas être modifiée, sauf erreur de l'appareil.

 

Date-Heure = Gxc.ReadXDateTime (FilePath, [DateTimeid])

Lit la date du cliché incorporée dans le fichier image par l'appareil photo.

 

FilePath : type string, chemin de l'image.

 

Retourne le string Date-Heure de 19 octets au format EXIF = aaaa:mm:jj hh:mm:ss; String vide ("") si erreur.

DateTimeId : Type string,

Id = { "org" | "mdf" | "dig" | "gps"}= Date-heure Originale, Date-Heure Générale(ou Modifiée), Date-heure de digitalisation, Date-heure Gps (utc).

 

ok = Gxc.Write (FilePath, Lon, Lat, Alt, Fmt, gDth, xDth, [Ctyp])

Écrit les coordonnées et Dates (2) dans le segment exif de l'image. Effectue une conversion Wgs84 vers UTM et écrit les coordonnées Easting, Northing (en mètres) dans le Tag ImageDescription. Ces coordonnées E,N correspondent au carroyage des nouvelles cartes Top25 de l'IGN.

 

FilePath : Type string, chemin de l'image.

Lon, Lat : type Double, latitude et longitude en degrés décimaux

Alt : type Double, altitude en mètres décimaux.

gDth : date et heure GPS au format Exif (String(20) Azt) format : aaaa:mm:jj hh:mm:ss chr(0) (autre format accepté jj/mm/aa hh:mm:ss chr(0))

xDth : Date et heure EXIF au format Exif (comme ci-dessus)

fmt : type string, format des coordonnées dans le segment Exif.

Pour la description du format voir plus bas le paragraphe FORMAT

Ctyp: Paramètre optionnel permettant de limiter l'écriture. défaut Ctyp="11110"

         Type string(5), exemples "11111" = tout, "10000" Latitude seule, "01100" Latitude et Altitude,

         "00010"=DateHeureGps seule ,"11110" = tout sauf date EXIF, "00001" DateHeureExif seule etc....

 

Retourne ok : type boolean, vrai si succès, faux si échec

 

ok = Gxc.WriteXDateTime (FilePath, DtStrValue, [DateTimeId])

Écrit une date dans le fichier image de la photo.

 

FilePath : type string, chemin de l'image.

DtStrValue : String,  Date-Heure de 19 octets au format EXIF = aaaa:mm:jj hh:mm:ss

DateTimeID : Type string,

Id = { "org" | "mdf" | "dig"  | "gps"}= Date-heure Originale, Date-Heure Générale(ou Modifiée), Date-heure de digitalization, Date-heure GPS(utc)

 

Retourne le boolean 'Vrai' si écriture, 'Faux' si Échec.

 

md = Gxc.ReadMapDatum

Retourne le string md donnant la valeur du tag GPsMapDatum

 

Gxc.WriteMapDatum( md )

Écrit le tag  la valeur du GpsMapDatum

md : string

 

msg = Gxc.GetMessage( IdMsg)

Lit les principaux tags exif ,WinXp et Gps/exif.

IdMsg : String indiquant le type des tags à lire : "Exif", "Gps", "WinXp"

 

Retourne le String multiligne "msg". Chaque ligne représente un tag, <Identifiant> Tab <Valeur du Tag>

On pourra afficher directement, l'ensemble du message avec l'instruction Vb6 :     MsgBox Msg

Ou accéder individuellement aux différents tags à l'aide d'un tableau  et de l'instruction "Split". Voir dans exemple btUnTag marqué "1T".

 

ok = Gxc.BatchWrite (FileListPath, DirPhotPath, [CrdFmt], [VerifyForm])

Écrit les coordonnées Gps (Wgs84 et UTM) dans les champs Gps/exif de toutes les photos appartenant au répertoire 'DirPhotPath'. Les coordonnées Gps doivent être présentées sous forme de liste dans le fichier 'FileListPath'. La correspondance entre les Photos et les Coordonnées se fait via la Date et l'Heure. Date-Heure Gps pour la liste et Date-heure Exif pour les photos. Avant écriture effective dans les photos, BatchWrite affiche une fenêtre de confirmation avec la liste des données à écrire, il est possible de faire des corrections manuelles avant la validation qui provoque l'écriture.

  - Fichier Points (.pts).   Dans ce cas une ligne est de la forme  :

    Reper  Tab  Longitude  Tab  Latitude  Tab  Altitude  Tab  DateGps  Tab  HeureGps  .......(accepte aussi le séparateur ; )

    Format Date : jj/mm/aa ou  aaaa::mm:jj ;  Format Heure : hh:mm:ss  

  - Fichier Trames Nmea (.nme ou .nmea)

 

Avant écriture les coordonnées  sont présentées dans une fenêtre de confirmation, avec possibilités de corrections manuelles.

 

FileListPath : Type string, chemin du fichier liste des coordonnées.

DirPhotPath : Type String , Chemin du répertoire contenant les photos.

CrdFmt : Option , type string, format des coordonnées dans le segment Exif. Defaut="D0M4S0"

VerifyForm : Option, boolean, si vrai la fenêtre de confirmation est affichée, si faux cette fenêtre n'apparait pas et un fichier 'CoordToWrite.text' est généré dans le répertoire programme. Ce fichier contient la liste des coordonnées à écrire.

 

Retourne ok : type boolean, vrai si succès, faux si échec

 

Les listes de coordonnées

 

Ne pas oublier de fixer le décalage heure-locale - UTC (propriété TlocMoinsUtc). TlocMoinsUtc on peut aussi de compenser un écart éventuel entre la date Exif (appareil photo) et la date des trames (GPS).

 

Les listes doivent être constituées de fichiers texte ASCII Les lignes de ces fichiers peuvent constituées de trames NMEA ou de listes de points. Il n'est pas besoin d'avoir des listes exhaustives. Sauf pour les trames NMEA il n'est pas nécessaire que les lignes soient ordonnées.

Pour pouvoir établir une correspondance avec les photos, il est nécessaire d'avoir un point avant et un point après chaque photo. On pourra donc stopper le GPS pendant les périodes d'inactivité photographique

Lors du traitement batch, RwGpsExif cherchera les points les plus proches des clichés, et fera une interpolation pour calculer les coordonnées à écrire, présentées dans la fenêtre de validation. La colonne 'iGpsLoc' présente le résultat de l'interpolation des 2 dates GPS les plus proches, converties en temps local pour plus de commodités. Si tout c'est passé correctement les colonnes 'Hre-Exif' et 'iGpsLoc' doivent être identiques.

Structure d'une ligne 'Liste de points' (2 syntaxes)

    Repère Tab Longitude tab Latitude Tab Altitude tag DateGps tab HeureGps [tab.....]

    Repère ; Longitude ; Latitude ; Altitude ; DateGps ; HeureGps [ ; ....]

Voir le format de chaque champ dans l'image ci-dessus. On pourra également écrire les dates sous la forme : ex  2006/08/24

Dans les listes on peut inverser la latitude et la longitude.

 

utl.WriteUTM_E_N (Easting, Northing)

Écrit les coordonnées UTL Easting et Northing dans le tag ImageDescription (270) ou autre : voir propriété UtmTagId

Easting,Northing : type Double.

 

Retour Sommaire

 

 

 

 

 

FORMAT

 

Dans le segment exif les coordonnées sont codées en degrés, minutes et secondes, avec le type exif dit 'rational'. Pour simplifier l'utilisation GpsExif utilise un format composé de 6 caractères de la forme "DdMdSd"

'Les lettres D, M, S signifient : Degrés, Minutes, Secondes et d désigne un chiffre représentant le nombre de décimales.

Par exemple , "D0M4S0" signifie : Degrés avec zéro décimale, Minutes avec 4 décimales, Secondes avec zéro décimale.

Dans l'immédiat j'ai limité l'écriture à 6 formats : "D4M0S0", "D0M2S0", "D0M0S0", "D6M0S0", "D0M4S0", "D0M0S2". Il n'y a pas de limitation en lecture.

Retour Sommaire

 

EXEMPLES

 

Ne pas oublier d'installer le FrameWork Microsoft avant utilisation. Avec la Dll sont fournis 2 exemples :

 

Répertoire 'GpsExif - VB6'

TestVb6.exe et son code Source TestVb6.vbp
Nota : en plus des composants standard vb6, il faut référencer 'GpsExif.tlb', ComDlg32.ocx, ieframe.dll et Scrrun.dll
 

Répertoire 'GpsExif - NET'

RwGpsExif.exe - Exécutable seul d'une application complète. Il n'y a pas d'installation, il suffit de copier le répertoire programme (exe + dll)  ou de cliquer sur l'icône "RwGpsExif" du bureau. Voir la documentation de RwGpsExif

 

Retour Sommaire

 

RAPPELS

 

COM

Ancienne plateforme Windows (Win98 et XP )

Développement avec VisualStudio VB6, VC++, .. ancien Delphi ..

Les DLL doivent en général être enregistrées avec RegSvr32.exe et sont partagées par les applications. Ces Dll sont le plus souvent situées dans le répertoire C:\Windows\System 32. C'est un peu le casse-tête car malgré la compatibilité binaire on se retrouve souvent avec des conflits de versions et des problèmes d'installations.

 

.NET

Nouvelle plateforme Windows (XPSP2 + Framework Microsoft v1,v2,v3) Les composants .NET ne sont plus partagés. Chaque application a ses propres composants qui doivent être situées dans le répertoire de l'application. C'est un gros progrès, car il n'y a plus besoin d'installeur et plus de conflits de dll. Pour installer une application .NET il suffit de copier le répertoire programme avec tous ses composants (=Assembly). Pour résumer on appelle cela des 'Installations Xcopy'

 

MIXTE

Il existe aussi 2 combinaisons mixtes : 'Appli .NET' avec composants COM et 'Appli COM' avec composants .NET. Ces combinaisons mixtes sont gérées par le service 'COM Interop' du framework. L'IDE .NET prend en charge la gestion des composants Com. Mais il y a un changement pour les applications COM utilisant des composants NET. Ceux-ci ne sont plus partagés (ce qui est normal, puisque que ce sont des composants Net) et doivent être mis dans le répertoire de l'application. Ils doivent également être accompagnés d'un fichier .tlb et être enregistrés avec la commande RegAsm.exe.

Retour Sommaire