Bonjour, Je suis Michel Hecht,
et Je suis ici aujourd'hui à parler à toi à propos importation binaire données dans JMP en utilisant JSL.
Je suis sur le équipe que développe le logiciel pour JMP, et allons obtenir commencé.
JMP peut importer beaucoup de différent formats de fichiers,
tout depuis texte brut à Exceller feuilles de calcul.
Quand ceux sont importé dans JMP, ils sont montré à toi comme a données tableau
que toi peut alors utiliser pour analyse plus approfondie avec tous de JMP capacités.
Mais quoi si il y a a données taper que toi ne peut pas importer?
JMP n'a pas savoir comment à faire il.
Dans ce cas étude, Je vais être regarder à le JPEG image format
que est joli commun parmi tous numérique caméras et téléphones intelligents.
Je suis bien sûr tout le monde familier avec il.
Dans fait, toi pourrait être adage,
attendez a minute, I pensée JMP peut ouvrir JPEG,
et dans fait, il peut ouvrir a JPEG.
Mais quand il fait, toi obtenir un image comme ce.
Mais il y a plus dans que JPEG que juste le image.
Pour exemple, si I obtenir information sur celui-ci,
I voir quoi gentil de appareil le image était pris avec, quoi lentilles étaient utilisé,
et même le GPS coordonnées de où I était debout quand I a pris le photo.
Maintenant, comment peut nous obtenir que données importé dans JMP?
Bien, nous peut faire il à travers JSL,
lequel Je vais obtenir à dans juste a minute.
Mais si nous ouvrir ce déposer dans a texte éditeur, nous voir que c'est pas humain lisible texte.
C'est a série de octets que sont montré comme ces non imprimable personnages,
et nous appel que binaire données.
C'est données c'est dehors le gamme
de normale alphabétique texte.
Il a a structure, cependant, et le données est fermé à l'intérieur là.
Si seulement nous peut déterminer comment à démêler il.
À faire que, nous besoin à savoir
le spécification de la façon dont cela données est posé dehors.
Dans le cas de JPEG, c'est défini par a spécification
appelé Exif ou Échangeable Image Déposer Format,
et nous peut télécharger le spécifications pour il.
C'est a document c'est a été existe depuis environ 20 ans,
et c'est dans utiliser par tous le appareils que produire JPEG.
Pas seulement matériel appareils comme caméras,
mais même Photoshop met métadonnées dans a JPEG dans ce Exif format.
À accéder il depuis JMP,
nous besoin à utiliser a JSL objet connu comme le GOUTTE ou Binaire Grand Objet.
Ce est juste a JSL objet que détient a séquence de octets.
Comme le nom dit, que séquence de octets peut être grand.
Nous peut en fait créer a GOUTTE en chargeant le contenu
de n'importe lequel déposer sur ton dur disque dedans en utilisant ce Charge T poste Déposer fonction.
Normalement, que serait retour le contenu de a déposer comme texte,
mais si nous ajouter ce GOUTTE mot-clé comme a deuxième paramètre,
alors le fonction retours a GOUTTE.
Nous peut prendre un GOUTTE et sous-ensemble a une partie de celui-ci
dans un autre GOUTTE en utilisant Aperçu du BLOB comme toi voir ici.
Ce est prise 50 octets depuis b, départ à compenser 100.
Maintenant le compenser pour BLOB est toujours en commençant à zéro,
donc le d'abord octet dans le GOUTTE est un compenser zéro.
Maintenant nous pourrait faire les deux de ceux opération dans un seul appel de fonction
par passage le compenser et longueur comme paramètres
à le GOUTTE mot-clé quand nous appel faible texte déposer.
Si toi voir ici que dit, ouvrir le fichier à ce chemin,
sauter 100 octets dans et puis lisez 50 octets, et retour que comme a GOUTTE.
Une fois nous avoir a GOUTTE,
nous peut convertir il à a personnage chaîne en utilisant le Goutte À Carboniser fonction.
Ici étaient prise b2 et conversion ses octets dans a personnage chaîne,
supposant que ceux octets sont dans le " jeu de caractères "us-ascii".
Si nous ne le faites pas spécifier a jeu de caractères, JMP suppose c'est UTF-8 .
Nous pourrait aussi considérer que GOUTTE
à contenir a série de numérique valeurs, tous de le même taper et taille.
En utilisant Goutte à Matrice ici, étaient prise b2,
lequel nous lire dans et ensemble être une longueur de 50 octets,
et interprétation il comme un tableau de non signé entiers,
chaque de lequel est deux octets long.
Nous devrait obtenir dos a matrice avec 25 Nombres dans il.
Maintenant que quatrième paramètre, le chaîne "grand,"
dit que ceux non signé entiers sont dans grand boutiste format,
signification le d'abord octet est le la plupart significatif,
est le partie la plus haute de la fin,
et alors suivi par le le plus bas partie de le fin.
Nous pourrait aussi spécifier le chaîne petit à spécifier petit-boutiste format.
Binaire fichiers avoir
les deux de ces types de représentation de entiers et autre Nombres.
Dans fait, le Exif format utilisations les deux gros-boutiste et petit-e intense.
Allons-y prendre a regarder à ces opérations dans action.
Je suis en allant à changer sur à JMP,
et je suis en allant à ouvrir ce démo scénario ici, D émo nombre 1.
Maintenant nous voir quelques de le code nous juste regardé à.
Ici nous sont chargement a texte déposer, ce déposer nommé Plage.j cheville.
Ce est le même déposer que I utilisé dans mon glisser.
C'est droite ici et toi peut voir il.
Toi peut aussi voir que il a une taille de à propos 3.4 moi.
Quand I courir ce un doubler de code
et enregistrer, il raconte moi que
b était attribué a GOUTTE de 3 45 000, et etc. octets, ou 3.4 moi.
Il n'a pas montrer moi tous ceux octets, mais I peut voir comment grand il est.
I peut obtenir que longueur en utilisant le Fonction de longueur,
juste comme toi utiliser pour personnage cordes.
Mais quand I utiliser Longueur sur a GOUTTE, il donne moi dos le nombre de octets.
I peut
obtenir a sous- GOUTTE de le d'abord six octets
dans b en utilisant Aperçu du BLOB.
Bien faire que ici,
et I voir a GOUTTE de six octets était assigné.
I peut en fait regarder à le valeur si I vouloir par juste
soumission le nom de le variable.
I peut voir ici sont ceux six octets dans ce format « ascii-hex »
FF-D8-FF-E1, et etc.
I peut prendre ces six octets et convertir eux à a matrice,
et Je suis en allant à convertir eux à a matrice de deux octets entier non signé
ou shorts dans grand-e intense format.
Donné que là sont six octets ici,
I devrait fin en haut avec a matrice de trois Nombres.
Quand I courir ce, bien sûr assez, il y a mon trois Nombres.
Nous peut voir ceux trois Nombres dans Hex
juste pour vérifier avec ce petit quatre boucle que I a écrit, donc allons faire que.
Là ils sont, juste même comme avant, FFD8, FFE1, 0982.
Donc maintenant, allons regarder à le suivant quatre octets suivant ceux six dans le déposer,
et Bien obtenir eux dans a sous- GOUTTE tous par eux-mêmes
donc que nous peut alors convertir e dans à a personnage chaîne en utilisant GOUTTE à Carboniser.
Quand I courir ce, Je comprends le personnage chaîne " Exif."
Toi peut avoir remarqué dans la diapositive
montrant le binaire déposer contenu
que que petit chaîne était en haut là près du sommet,
et c'est partie de le Exif déposer spécification et identifie il comme tel.
Allons-y aller dos à les diapositives.
Ceux fonctions sont puissant.
Ils laisser nous faire quoi nous besoin à faire à manipuler et lire données depuis a GOUTTE,
mais ils sont a petit lourd à utiliser.
Allons-y écrire notre propre services publics à faire eux a peu plus maniable.
Je suis en allant à commencer avec a fonction que j'ai nommée Read Value
et il prend a GOUTTE et alors quelques compenser dans ce BLOB,
et alors le numérique taper Je veux lire et le taille de que taper.
C'est en allant à lire un valeur dehors de le GOUTTE.
I passé mon GOUTTE et compenser et taille dans Coup d'oeil BLOB,
obtenir dos a sous- GOUTTE de juste ceux octets, et alors appel Goutte À Matrice
passage dans le taper.
I utiliser le même taille,
donc le taille de le GOUTTE et le taille de un élément sont le même.
I devrait obtenir dos a matrice de une valeur
et I passer dans "grand" parce que Je suis juste toujours en allant à utiliser gros-boutiste format.
Mais I ne le faites pas vouloir à retourner un matrice.
I vouloir à retour que un valeur, donc I tirer il dehors de le matrice et retour que.
Ce est appelé comme donc. I appel Lire la valeur, I passer dans b.
I lire un entier non signé départ à décalage zéro
et c'est deux octets long et I obtenir dos que valeur FFD8.
Il y a a problème avec ce code cependant, et c'est dans ce paramètre b.
B est que GOUTTE c'est 3.4 à dans taille.
Le problème est que JSL, quand passage a GOUTTE à a fonction,
toujours passes il par valeur, signification il fait a copie de il.
Pour chaque célibataire nombre I vouloir à se retirer de mon GOUTTE en utilisant ce fonction,
il volonté faire a copie de que 3.4 à
juste pour tirer dehors deux octets, ou quatre octets ou quoi que ce soit, et alors lancer il loin
quand le fonction retours.
C'est inefficace, gaspilleur, et probablement vraiment lent,
donc nous ne le faites pas vouloir à faire que.
Comment peut nous obtenir autour que?
Bien, plutôt de passage il comme a paramètre, allons mettre il dans a mondial.
Bien faire a mondial que nous charger avec notre BLOB,
et alors nous peut appel le fonction
et ça va juste référer à le mondial plutôt de a paramètre.
Dans fait, nous peut faire a bouquet de globales.
Nous peut enregistrer le longueur de le GOUTTE à compenser
à où nous sont actuellement traitement données dans le GOUTTE,
et peut être même pour le boutisme.
Le problème avec globales, cependant,
est que ils sont dans le mondial table des symboles,
et ils pourrait interférer avec autre code que toi avoir.
Dans fait, épouser comme à écrire notre importation code comme quelque chose que peut être utilisé
par autre clients,
et ceux clients pourrait avoir leur propre variables par ces noms,
ou ils pourrait être en utilisant autre code bibliothèques que serait interférer.
Comment faire nous obtenir autour que?
Bien, J'ai fait il par création a espace de noms.
I appel mon espace de noms " Analyseur EXIF"
Maintenant, plutôt de globales, I mettre eux tous comme variables à l'intérieur de mon espace de noms,
et maintenant ils sont N espace globales avec que préfixe.
Avant I appel mon fonction, I besoin à initialiser eux.
Je vais charger le "Plage.jpeg" déposer dans le EXIF P arser GOUTTE,
Je vais enregistrer c'est lien.
Je vais commencer désactivé mon compenser à le très début à zéro,
et Je vais ensemble le boutisme à "grand,"
et alors I peut changement mon fonction, simplification il a peu comme ce.
Maintenant, J'ai en fait mettre mon fonction dans le même espace de noms Lire la valeur
comme partie de le EXIF Analyseur espace de noms.
Maintenant, tous I besoin à faire est passer a type et une taille.
Aperçu du BLOB maintenant utilisations le BLOB global c'est stocké dans le espace de noms,
le courant mondial compenser que nous lisons,
et GOUTTE le matrice même utilise l'endianness,
donc nous peut paramétrer cela, nous peut changement il.
Une fois J'ai récupéré le résultat I vouloir,
Je vais incrément le compenser par le nombre d'octets
nous juste processus, et alors Je vais retour il comme avant.
Allons-y voir quoi que apparence comme dans action.
Nous allons regarder à Démo 2
et voici mon espace de noms.
Ici sont mon globales dans que espace de noms.
Voici le Lire la valeur fonction, juste comme nous scie.
J'ai a obtenu quelques plus fonctions. J'ai mettre un Analyseur EXIF
Voici Lire court, ce qui provoque simplement la lecture de la valeur,
mais il toujours passes non signé entier de deux octets.
De la même manière, Lire Long lit et non signé int de quatre octets.
J'ai aussi a obtenu Lire Ascii que tu le passes a taille dans octets
et il fait a sous- GOUTTE de que beaucoup octets
à le actuel compenser depuis le BLOB global,
et alors cause GOUTTE à charge à convertir il dans a chaîne.
C'est en utilisant le caractère « us-ascii » ensemble,
parce que c'est le jeu de caractères que le Exif spécification dit
tous c'est personnage données utilisations.
Alors juste comme avec Lire la valeur, il incréments à compenser passé le octets
que étaient déjà traité et retours le chaîne.
Allons-y soumettre tous de ce code
donc que ceux des choses sont tous défini et alors nous peut essayer à utiliser eux.
D'abord, Bien initialiser notre EXIF P arser globales,
et alors Je vais lire le d'abord trois shorts depuis le déposer juste comme nous a fait avant.
Mais maintenant, Je suis en allant à appel Lire court.
Étaient départ il désactivé à zéro,
donc Je suis en allant à appel il trois fois dans ce boucle.
Il volonté lire dans chaque successif court,
progresser compenser comme il va, et ensuite imprimer eux dehors juste comme avant.
Là ils sont.
Maintenant, notre compenser est séance à décalage six juste passé le dernier chose il lire.
I peut appeler Lire Ascii pour quatre octets et I obtenir dos que même chaîne.
D'accord, donc allons aller dos à diapositives.
Maintenant, nous avoir quelques outils nous peut utiliser à commencer bâtiment notre Analyseur EXIF.
Nous besoin à toi dans le caractéristiques
à voir quoi fait le EXIF données format et ce JPEG déposer regarder comme.
Bien, à le haut niveau, il apparence quelque chose comme ce.
Il commence avec deux octets, lequel sont qu'est-ce que appelé le commencer de image marqueur.
Nous avons déjà vu ceux deux octets.
Ils sont le valeur FFD 8.
Si ton déposer n'a pas commence par ça, c'est pas a JPEG.
Alors il y a a série de blocs de données,
et chaque bloc commence avec deux octets, lequel est a marqueur,
alors deux octets, lequel est a taille,
et alors quelques données lequel est cependant beaucoup octets le taille de là étaient.
Maintenant le taille aussi comprend elle-même, donc vraiment le données est taille moins deux.
Toi peut voir là, sont a ensemble de différents types de blocs définis,
mais quelques de eux sont facultatif, quelques de eux peut être répété.
Le ceux que nous soins à propos sont APP1 et APP2.
C'est où le EXIF données volonté être.
Alors il y a a bouquet de autres que nous ne le faites pas soins à propos de.
Finalement, nous voir un appelé Commencer de Balayage ou SOS.
Quand nous frapper que, nous savoir que le suivant partie de le déposer
volonté être le réel image données, lequel est le pixels.
Quand nous frapper que, nous peut arrêt.
Alors après le image données est fin de image.
Nous besoin un algorithme à lire ce données.
Voici quoi Bien utiliser.
D'abord, Bien lire le d'abord deux octets,
voir si il matchs le commencer de marqueur d'image,
et alors nous savoir nous avoir a JPEG.
Alors Bien avoir a alors que boucle, où dans la boucle while
chaque temps à travers, Bien processus a célibataire bloc.
À faire que, nous volonté sauvegarder le actuel compenser position,
lire le deux octets pour le suivant marqueur,
et si que marqueur est SOS, nous peut casser dehors de le boucle.
Suivant, nous lire le deux octets pour le taille.
Maintenant nous avoir tous le information nous besoin à processus le bloc.
Peu importe que implique, Bien faire il.
Alors nous peut sauter passé le données dans traitement du cas du bloc
n'a pas changement notre décalage du tout, mais Bien explicitement déplacer notre décalage
à peu importe il était à le début de le boucle,
plus le deux octets pour le marqueur, plus le valeur de le bloc taille.
Quand nous obtenir dehors de le boucle,
nous soit couru dehors de données dans le bloc à processus ou nous frapper que SOS marqueur,
donc étaient fait.
Allons-y voir quoi que apparence comme.
Démo 3 a ce code.
Toi voir, nous avoir notre espace de noms, et tous ce est le même comme avant.
Je suis en allant à courir il juste à s'assurer tout est défini.
Maintenant, étaient ajout a nouveau fonction,
lequel J'ai aussi mettre dans le espace de noms,
et c'est appelé Analyseur EXIF : obtenir les données EXIF brutes,
et Je suis passage dans le chemin à le déposer, ce JPEG déposer que nous vouloir à processus.
Maintenant, J'ai défini un associatif tableau ici que cartes ceux magie marqueur codes
à leur abréviations afin que nous puissions imprimer eux dehors sur le enregistrer.
I charger en haut mon
Exif Analyseur globales comme avant,
seulement maintenant Je suis passage dans le déposer chemin que I était donné,
et alors I commencer interprétation quoi le données est.
D'abord, I regarder à le très d'abord court
et faire bien sûr c'est au début de image marqueur.
Si pas, I juste retour parce que c'est pas a jpeg déposer.
Je suis en allant à écrire à le enregistrer que I scie il à compenser zéro.
Alors voici mon alors que boucle à marcher à travers ceux blocs.
À le haut de le boucle,
Je suis en allant à réinitialiser mon boutisme à "grand," parce que quelques de le blocs,
quand nous processus eux, volonté avoir leur propre boutisme
et changement il à petit.
Nous vouloir à savoir que le l'endianité est grand à le haut de la boucle
parce que le bloc structure toujours utilisations gros-boutiste données.
Alors Je suis en allant à sauvegarder peu importe le actuel compenser est,
et alors Je suis en allant à lire le suivant marqueur.
C'est a court, et Identifiant regarder à voir si c'est égal à SOS,
lequel est que magie nombre.
Si il est, I peut casser dehors de le boucle après enregistrement que I scie il.
Suivant, Je vais lire le deux octets pour la taille du bloc,
et alors I volonté processus le bloc.
Maintenant, dans ce exemple, mon traitement consiste de en écrivant a message à le enregistrer,
donc Je vais faire que.
Alors Je suis prêt à sauter passé le bloc.
I faire que par changement mon compenser à être peu importe il était à le début,
plus le deux octets pour le marqueur, plus le bloc taille.
Quand I casser dehors de le boucle, I réinitialiser mon mondial sable Je suis fait.
Allons-y définir que fonction par soumission ce.
Je vais courir scénario, et alors I peut l'appeler passage dans "Plage.jpg,"
Voyons quoi nous obtenir.
Il imprimé dehors à le enregistrer.
Il compenser zéro, il y a commencer de image, alors il compenser deux, il y a APP1,
et il a ce taille 2 466 octets.
Alors nous obtenir APP2, lequel a à propos 30 000 de données.
C'est la plupart de il droite là.
Alors nous avoir a bouquet de blocs que on ne s'en soucie pas vraiment,
mais finalement, nous voir SOS donc nous casser dehors de le boucle.
C'est tous fonctionnement Bien.
Allons-y aller dos à diapositives.
Maintenant, Je suis en allant à sauter devant dans traitement quelques de ce déposer format
juste pour le saké de temps.
Mais si toi télécharger le papier c'est associé avec ce parler,
le complet code est là et beaucoup plus détail.
I très recommander que toi faire que,
mais Je suis en allant à te donner a saveur de il ici.
Quoi nous faire suivant est nous processus chaque de ceux blocs que nous avoir lire,
et quelques de eux nous peut ignorer.
Nous vouloir à filtre dehors le blocs que faire pas contenir excès données.
Alors le ceux que faire, nous besoin à faire c'est propre analyse.
Quoi nous avons découvert quand nous regarder dans le Spécification Exif
est que ces blocs contenir leur propre ensemble de blocs de données
appelé Image F avec Répertoires ou IFD.
Alors ceux contenir individuel métadonnées information
avec balises adage quoi le les données sont
et alors quoi format c'est dans, et alors le données elle-même.
Nous vouloir à collecter tous de ceux des choses ensemble dans ces listes.
Il y aura être listes de listes de listes, a quelque peu compliqué données structure.
Mais le liste données structure est très générique
et JMP et peut prise tous types de données, donc c'est quoi nous vouloir à utiliser.
Ça va avoir ceux métadonnées articles étiqueté
avec ces numérique valeurs que nous appel le brut balises,
mais nous vouloir à remplacer ceux
avec réel humain lisible étiquettes que identifier quoi ils sont.
Allons-y regarder à ce et JMP, et Je vais regarder à Démo 4 .
Maintenant, à ce indiquer,
I avoir pris tous mon code dans le « Analyseur EXIF » espace de noms
et mettre il dans c'est propre déposer.
Maintenant Démo 4 est a client de mon code, lequel est un « EXIF Parser.jsl ».
I peut juste inclure que.
Maintenant, le fonction que obtient le données,
I peut appel il passage dans le nom de le jpeg déposer.
Maintenant J'ai étendu ce fonction dans ici en fait processus ceux blocs,
et les briser vers le bas, filtre dehors le ceux que sont pas EXIF
tous le des choses nous juste parlé de, et donner nous dos que données structure.
Allons-y courir ce et voir quoi nous obtenir.
Bien, nous obtenir a parcelle de Nombres, quelques cordes.
Toi voir, ce est dans listes dans listes ici,
et il y a un le plus à l'extérieur liste,
et alors il contient différent articles lequel sont listes.
Chaque de ceux avoir ces paires de valeurs.
Il y a a nombre lequel est le brut étiqueter, et alors le valeur.
Ce son a chaîne. Ce un est aussi a chaîne.
Ce son a nombre. Ce son a matrice.
Le données peut être différent types, mais le balises sont tous Nombres.
Quoi nous vouloir à faire suivant est convertir ceux Nombres dans humain lisible articles.
Dans fait, ce entier liste,
nous vouloir à convertir il dans un associatif tableau que index le données par clés.
Le d'abord chose Je suis en allant à faire
est défini a cartographie depuis ces Nombres au humain lisible clés nous vouloir à utiliser.
C'est dans ce long associatif tableau droite ici.
Maintenant, Je suis en fait en utilisant le Hex valeurs pour les clés,
parce que c'est comment ils sont spécifiés dans le Spécification Exif,
et il fait il Plus facile à suivre le long de quand tu es regarder à le spéc.
Il y a a bouquet de ceux,
et Je suis en allant à commencer à le en bas et je remonte.
Vers le bas ici à ce fonction, Étiquette Brut Données.
I passé dans ce entier données structure d'où nous sommes revenus analyse le GOUTTE.
Voici le définition de Étiquette Brut Données.
Je suis en allant à retour
a liste comme mon résultat,
donc Je suis en allant à marcher à travers le liste comme mon saisir et utiliser il
à construire en haut le résultat liste.
I utiliser ce Pour Chaque construction, lequel est a nouveau moderne Fonction JMP
que promenades à travers a liste, et pour chaque élément de le liste,
il tire que dehors dans ce variable brut exif, qui Je vais passer à ce fonction.
Alors I vouloir à ajouter il à mon résultat. I faire que en utilisant ce Insérer Dans doubler.
Je suis insertion il à le fin de résultat, et I avoir à utiliser Évaluer Liste à surmonter
quelque chose que JMP est faire à être utile avec liste création.
Encore, il y a plus détail à propos ce truc dans le papier.
C'est valeur téléchargement et vérification dans.
Mais pour ici, étaient juste en allant à regarder à le appel à Étiquette EXIF,
et c'est droite en haut ici.
Étiquette EXIF est en allant à faire a similaire chose
où c'est en allant à marcher à travers chaque de ces étiqueter valeur paires.
Plutôt de de retour a liste, ça va à retour un associatif tableau.
Ici, nous sont initialisation des résultats à être un associé tableau.
C'est quoi ce jeton moyens.
C'est un vide associatif tableau, et alors Bien retour il à le fin.
Bien aussi utiliser pour chaque à marcher à travers la liste,
et nous savoir que chaque brut article est en allant à être a liste de deux éléments.
Nous obtenir le d'abord élément,
lequel est le brut étiqueter, et puis le deuxième l'élément est le données.
Nous simplement construire en haut notre association tableau par ajout
un article à clé par le brut étiqueter avec le valeur de le données.
Joli simple, sauf nous je ne veux pas le clé à être le brut étiqueter.
Nous vouloir à transformer il en utilisant notre chercher tableau.
C'est quoi Obtenir Étiqueter fait, et c'est défini suivant en haut ici.
Il simplement prend le étiqueter identifiant nous passer dans, convertis il à hexadécimal.
Ce volonté donner nous dos un quatre caractères hexadécimal chaîne.
Nous besoin le droite la plupart quatre personnages de cela,
et alors nous regarder il en haut dans notre si étiqueter tableau en haut ici.
Je suis en allant à soumettre tous ce code
à définir il, et alors nous l'aurons appel Étiquette Brut Données.
Voici le résultat.
Toi peut voir que c'est similaire à avant, sauf maintenant,
plutôt de le le plus haut liste des niveaux, il n'a pas avoir un autre liste,
il a un associatif tableau.
Ce haut la plupart chose est a liste de associé tableaux.
Ce d'abord un nous peut voir que le clé brute peu importe le nombre était,
a obtenu converti à DateT faire et il y a c'est valeur et donc sur.
Mais nous avons remarqué le deuxième un apparence comme il a balises
que n'a pas obtenir converti.
Pourquoi est que?
Bien, c'est parce que ce clé ExifIFD a comme c'est données.
En fait, un autre Tsahal, Oui, ce est a récursif données structure
c'est défini dans termes de elle-même.
Si nous vouloir à étiquette le des choses à l'intérieur ici,
nous avoir à changement notre code à étiqueter de manière récursive,
et Bien obtenir à que dans a minute.
Mais avant I partir ce, I vouloir à montrer que Je suis en allant à en fait
combiner ces deux mesures dans a célibataire fonction que I appel Obtenir EXIF données,
où I d'abord obtenir le brut Exif données dehors de le GOUTTE,
et alors I étiquette il, et puis je retour le résultat de que.
Allons-y définir et courir que,
et il devrait être exactement la même chose comme quoi nous juste scie.
Bien sûr assez, il est.
Je suis en allant à fermer ce et aller dos à diapositives.
Ouais, saut devant encore,
comme I mentionné, nous avoir à faire notre étiquetage récursivement.
Comme I mentionné, quelques entrées dans nos métadonnées ou IFD
avoir comme leur données un autre IFD.
Que moyens nous avoir à appel notre étiquetage routine récursivement.
Le chemin que I faire il,
est à utiliser ce JSL construit- dans Récursivité, lequel appels le actuel à fonction,
et toi peut passer dans séparé paramètres pour le récursif appel.
Il y a plus détails sur que dans le papier,
lequel Je suis bien sûr tu as déjà téléchargé à ce indiquer.
Maintenant, le un chose à être conscient de
est-ce que quelques de ces intégré IFD, la plupart de eux utiliser le même chercher tableau
que nous déjà défini,
mais quelques de eux avoir leur propre chercher tableau.
Nous avoir à faire bien sûr étaient passage
le correct chercher tableau avec sa propre définition de balises
à notre récursif appel comme étaient en allant à travers le différent niveaux de récursivité.
Alors une fois nous avoir a pleinement étiqueté données structure retour,
nous peut extrait pièces depuis il pour obtenir le des choses étaient intéressé dans.
Nous peut courir que sur a entier série d'images
et collecter tous que données dans a données tableau ou quelques autre format.
Allons-y regarder à que dans JMP.
Bien tirer en haut Démo 5, lequel ici J'ai
roulé tous de que récursif étiquetage dans mon Obtenir EXIF Données fonction.
Je suis en allant à inclure mon espace de noms code et alors courir que fonction.
Maintenant étaient obtenir dos
notre pleinement étiqueté
données structure.
Toi peut voir que maintenant cet identifiant EXIF il y a des étiquettes dedans.
Là est ce grand bloc de données de numérique truc,
et nous regarder et nous voir que c'est dans ce chose appelé Fabricant Note.
Fabricant Note est a spécial extension à le Spécification Exif
que permet le fabricant de a particulier appareil, dans ce cas , Pomme,
le fabricant de un iPhone 12, à intégrer leur propre propriétaire données.
Dans quelques cas, a caméra fabricant pourrait révéler quoi ils ont intégré là.
Dans autre cas, personnes avoir trier de
deviné à il et viens en haut avec leur meilleur deviner.
C'est le cas avec Pomme.
Il y a quelques des choses que sont connu et autre des choses que ne sont pas connu.
Tu aurais voir a parcelle de ce est juste non étiqueté.
Mais quelques des choses nous peut voir, vecteur d'accélération et temps d'exécution,
et étagère dans là.
De toute façon, étaient en allant à ignorer cela pour la plupart
et regarder à quoi ce chose contient.
I peut voir que c'est un associatif tableau dans que d'abord élément,
et c'est où la plupart de le des choses I vouloir à accord avec
est-ce que je suis en allant à tirer que dehors dans c'est propre variable droite ici.
Il a 14 éléments, donc nous peut voir quoi ceux sont, quoi leur clés sont
comme donc.
Là sont ceux clés.
Si nous vouloir à tirer quelque chose dehors comme "Modèle,"
I peut faire que simplement par abonnement dans exif1 "Modèle"
et I peut voir c'est iPhone 12 Pro.
I peut faire le même chose à obtenir le date temps, et là il est.
Mais ce est dans le date temps format que le Exif spécification définit.
C'est pas a format que JMP reconnaît,
mais I peut utiliser JMP dans fonction de formatage à convertir il dans quelque chose
en utilisant ce format modèle option, lequel est a moderne JSL chose
que permet nous spécifions le modèle de le date temps données,
et JMP volonté convertir il à a numérique date et heure,
lequel il reconnaît comme tel, et formats il pour le enregistrer.
Que travaillé.
Maintenant, Je suis aussi intéressé dans le GPS coordonnées,
et c'est dans ce GPS IFD partie de le EXIF.
Il est un de ceux que est lui-même un IFD.
Allons-y accéder il, et alors nous peut voir quoi il contient.
Il a information à propos le altitude,
différentiel, image direction, latitude, longitude, et vitesse.
Quoi nous soins à propos est le latitude et la longitude, lequel est ces quatre des choses.
Il y a latitude, il y a longitude,
et alors ils avoir ces associé Réf. valeurs.
Nous besoin tous quatre de ceux à calculer le coordonnées.
Allons-y commencer avec le latitude.
Bien tirer que dehors dans c'est propre variable, et nous voir c'est a liste de trois éléments.
Si nous regarder à quoi ceux trois les éléments sont,
nous voir que là sont trois vecteurs avec deux Nombres dans chaque un.
Le Exif spécification fait référence à ces comme rationnels, et il utilisations eux a parcelle.
Mais quoi nous vouloir est réel Nombres plutôt de ces rationnels,
numérateur ,dénominateur.
Nous peut convertir eux en utilisant ce Transformer Chaque fonction,
lequel boucles à travers ce liste et traite chaque élément
après putting il dans a locale variable r.
Nous vouloir à processus que par partage
le dénominateur dans le numérateur, et alors transformer chaque construit a nouveau liste
de ceux résultats et le met dans notre variable,
que être, comme toi voir là.
Maintenant ces trois Nombres sont le degrés, minutes, et secondes,
mais nous vouloir à combiner eux tous dans a célibataire valeur pour JMP à utiliser.
Nous avoir à ajouter eux ensemble, mise à l'échelle chaque composant de manière appropriée.
Faire que là et nous obtenir
le valeur.
Maintenant, si c'est dans le Nord hémisphère, étaient bien.
Mais si c'est dans le Du sud hémisphère, il besoins à être négatif.
Si nous regarder à que "GPSL" attitudeR si,"
c'est soit N ou S, lequel raconte nous si c'est S, nous besoin à nier il.
Nous peut faire le même chose pour longitude.
C'est LongitudeR si volonté être soit E ou DANS.
E est positif est valeurs et W est négatif Ouest valeurs.
Ici nous voir nous avait à nier
le longitude parce que il était dans le Ouest.
Si nous décharge ceux deux Nombres dehors, nous peut utiliser JMP construit- dans formats pour
latitude et longitude,
et nous peut vérifier que ils correspondre
qu'est-ce que Trouvailles peut tirer dehors de le déposer comme ceux coordonnées.
Nous peut voir que c'est Nord et Ouest, donc c'est dans Nord Amérique.
Maintenant Je suis en allant à sauter à Démo 6 , où nous mettre tous ce ensemble.
Je suis en allant à utiliser que code à extraire des informations
dehors de a entier bouquet de photos.
Dans ce dossier, I avoir 16 de eux,
et ils sont photos que J'ai pris à précédent JMP Découverte Sommets
dans Europe sur années dos quand nous utilisé à faire eux dans personne.
Ça va mettre tous le informations il découvertes dans a données tableau.
Je suis en allant à courir ce et voici notre données tableau,
et nous peut voir que J'ai capturé le noms de le image fichiers
et le horodatages.
Toi peut voir il va depuis 2016 à 2018,
et le Lat et L ONG sont Nord et Est, donc c'est Europe.
I peut même voir le progression de différents modèles d'iPhone que j'avais
à travers ceux années et comment leur lentilles amélioré sur temps.
J'ai ensemble ce en haut donc que I peut sélectionner une ligne
et cliquez ce Obtenir Informations script de table, et il ouvre a fenêtre pour moi
que spectacles moi le photographier et les métadonnées pour il
que J'ai capturé.
I même avoir a bouton ici montrant Google Maps,
donc I peut cliquez que, et apparaît a Google carte de que emplacement.
C'est droite là avec le rouge marqueur.
I peut voir si je z oncle dans que c'est le Hilton Amsterdam.
C'est où nous avait le conférence dans 2016.
Que tous semble à travail Bien,
I n ce cas,
Je suis en allant à ajouter le photos eux-mêmes à mon données tableau comme un expression colonne.
C'est quoi ce Ajouter Photos tableau scénario fait.
Pour plus grand collections, I serait pas vouloir à faire que
parce que c'est en fait fabrication a copie de ces photos dans le données tableau.
Mais pour 16, c'est bien.
Pour des milliers ou même des centaines, tu ferais probablement pas vouloir à faire que.
Mais c'est aussi ensemble mon nouvelle colonne à être a étiquette colonne.
Maintenant I peut courir ce Explorateur scénario lequel ouvre
a graphique constructeur de ceux latitudes et longitudes.
I peut voir quelques points ici. Voici Amsterdam.
Il y a a photo nous juste scie et voici quelques plus.
C'est certainement Amsterdam.
Ces sont Bruxelles. Oui, c'est Bruxelles.
Sur ici, nous avoir Francfort.
Que année, nous a obtenu à aller à le cool
supercar Musée.
Que était joli soigné.
Sur ici nous avoir Prague.
Je suis en allant à utiliser le loupe à zoom avant sur Prague a couple de fois.
A t ce indiquer notre détaillé Terre arrière-plan est pas vraiment portion nous beaucoup
donc Je suis en allant à changer dans la rue carte service.
Nous peut voir, Oui, c'est certainement Prague,
et ici est où nous chevauchait le historique rue voitures jusqu'au château de Prague
Ici est quelques JMP participants passage le pont vers le château de Prague.
I peut voir John automne là dans le distance.
Sur ici, nous avoir a très bon réception que nous détenu dans le municipal salle.
Voici moi vérification le temps
sur mon Pomme montre contre le horloge à faire bien sûr que c'est droite.
Que tous semble à être faire quoi nous vouloir.
Dans conclusion, I vouloir à touche sur le des choses que nous savant.
Nous savant à propos le JSL objet GOUTTE,
lequel est a bien outil à avoir sur ton outil ceinture
pour manipuler arbitraire données binaires.
Nous utiliser que à construire en haut a petit application pour importation fichiers.
Le long de le chemin, nous savant quelques des choses à propos des espaces de noms, et JSL récursivité,
spécialisé liste manutention, et quelques moderne JSL des choses comme Transformer Chaque, Pour Chaque.
À ain ceux des choses sont couvert dans beaucoup plus détail dans le papier.
Mais la plupart surtout,
I pense est que nous scie a cas étude de comment faire prendre a difficile problème
comme a format de fichier complexe
et casser il dans sous-tâches plus petites que nous pourrait conquérir.
C'est a compétence que nous tous avoir et besoin à faire utiliser de dans notre professionnel travail.
Mais I pense c'est beaucoup fois utile à
observer quelqu'un autre faire il et ramasser conseils et outils et techniques
que nous peut alors utiliser dans notre propre travail.
Maintenant I vouloir à tourner il sur à toi
à prendre ces outils et utiliser eux à importer et écrire le code à créer ton propre
binaire fichiers et résoudre ton propre problèmes.
Remercier toi très beaucoup.