Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: PHOTO : JPEG JFIF EXIF Jeu 1 Juin 2023 - 14:45 | |
| Bonjour à tous ! La semaine dernière, le forum a été très actif autour d’un sujet qui touche la photo. J’en profite pour remercier tous les acteurs de cette effervescence. Cela m’a donné envie d’écrire un petit programme en pur Panoramic pour extraire uniquement quelques-unes des principales données JPEG, JFIF et EXIF d’une photo .jpg. Le MEMO intitulé « Données techniques » était juste pour moi afin de faciliter le débogage du programme. Dans la partie « Historique » les vignettes photos sont cliquables pour recharger une photo déjà analysée. - Code:
-
' Quelques métadonnées des photos Jpeg ' Marc - mars 2023 ' Ecrit en langage PANORAMIC 0.9.29.i9
label chargerPhotoHistorique1, chargerPhotoHistorique2
dim nomFichier$, nomFichierPhotoActif$, nomfichierPhoto_1$, nomfichierPhoto_2$ dim buffer%(65536), buffer2%(65536), largeur%, hauteur%, ratio, premierePhotoAnalysee% dim intel% ' intel% = 0 alignement des octets MOTOROLA : Big endian (valeur par par défaut) ' intel% = 1 alignement des octets INTEL : Little endian
label redim0, rechercherPhoto
interfaceUtilisateur()
end ' ------------------------------------------------------------------------------ sub interfaceUtilisateur() ' creer fenêtre principale avec une surface utile de 1000x650 width 0,width(0) - width_client(0) + 1000 height 0,height(0) - height_client(0) + 670 ' centrer à l'écran la fenêtre principale left 0,(screen_x - width(0)) / 2 top 0,(screen_y - height(0)) / 2 ' définir la couleur de fond de la fenêtre principale color 0,255,255,255
' interdire le redimensionnement de la fenêtre principale on_resize 0,redim0 ' mettre un titre dans le bandeau de la fenêtre principale caption 0,"PANORAMIC Metadata of JPEG photos" ' Créer le titre principal alpha 1 top 1,10 font_color 1,0,0,255 font_name 1,"Calibri" font_size 1,24 caption 1,"Les métadonnées des photos Jpeg" ' Centrer le titre principal left 1,(width_client(0) - text_width("Les métadonnées des photos Jpeg",1))/2
' créer un bouton pour charger une photo à analyser button_picture 2 top 2,75 left 2,60 width 2,100 height 2,60 font_size 2,10 button_picture_target_is_picture width 2,0 height 2,0 caption 2,"Rechercher" + chr$(13) + "une photo" cursor_point 2 on_click 2,rechercherPhoto ' créer une zone d'affichage de la photo sélectionnée panel 3 top 3,170 left 3,30 width 3,160 height 3,107 color 3,0,0,0 ' PICTURE masquer le contour du PANEL (facultatif, purement esthétique) picture 93 parent 93,3 top 93,0 left 93,0 width 93,160 height 93,107 color 93,0,0,0
' PICTURE pour afficher la photo en cours d'analyse picture 4 parent 4,3 top 4,0 left 4,0 width 4,160 height 4,107 color 4,230,230,230 stretch_on 4 hint 4,"Photo en cours d'analyse" ' créer une zone d'affichage (MEMO) pour écrire les données techniques memo 5 left 5,220 top 5,85 width 5,360 height 5,536 ' créer le titre de la zone d'affichage des données techniques alpha 6 left 6,230 top 6,65 font_size 6,10 caption 6,"Données techniques :" ' créer une zone d'affichage (MEMO) pour écrire les données EXIF memo 7 left 7,610 top 7,85 width 7,360 height 7,536 ' créer le titre de la zone d'affichage des données EXIF alpha 8 left 8,620 top 8,65 font_size 8,10 caption 8,"Métadonnées :" ' HISTORIQUE 1 : créer zone d'affichage de la dernière photo analysée (n-1) panel 9 top 9,350 left 9,30 width 9,160 height 9,107
' PICTURE masquer le contour du PANEL (facultatif, purement esthétique) picture 91 parent 91,9 top 91,0 left 91,0 width 91,160 height 91,107 color 91,0,0,0
' picture d'affichage de la photo n-1 picture 10 parent 10,9 top 10,0 left 10,0 width 10,160 height 10,107 color 10,230,230,230 stretch_on 10 cursor_point 10 on_click 10,chargerPhotoHistorique1 inactive 10
' HISTORIQUE 2 : créer zone d'affichage de l'avant dernière photo analysée (n-2) panel 11 top 11,495 left 11,30 width 11,160 height 11,107 color 11,0,0,0
' PICTURE masquer le contour du PANEL (facultatif, purement esthétique) picture 92 parent 92,11 top 92,0 left 92,0 width 92,160 height 92,107 color 92,0,0,0
' PICTURE pour afficher la photo n-2 picture 12 parent 12,11 top 12,0 left 12,0 width 12,160 height 12,107 color 12,230,230,230 stretch_on 12 cursor_point 12 on_click 12,chargerPhotoHistorique2 inactive 12 ' créer ligne d'affichage pour le nom de la photo n-1 alpha 13 top 13,460 left 13,35 font_size 13,8 caption 13,"Pas d'historique" ' créer ligne d'affichage pour le nom de la photo n-2 alpha 14 top 14,605 left 14,35 font_size 14,8 caption 14,"Pas d'historique" ' créer ligne d'affichage pour le nom de la photo en cours d'analyse alpha 15 top 15,280 left 15,35 font_size 15,8 caption 15,"Pas de photo chargée" ' creer ligne d'affichage, légende "Historique :" alpha 16 top 16,320 left 16,75 font_name 16,"Arial" font_size 16,11 font_italic 16 font_color 16,0,0,250 caption 16,"Historique :" ' Créer ligne d'affichage de la barre d'état (en bas de la fenêtre) alpha 17 top 17,645 font_color 17,0,0,50 font_size 17,10 caption 17,"Pas de photographie en cours d'analyse" ' Centrer la ligne d'affichage de la barre d'état left 17,(width_client(0) - text_width("Pas de photographie en cours d'analyse",13))/2
' créer une boite de dialoque pour ouvrir un fichier image open_dialog_pic 18
' ajouter un filtre à la boite de dialogue pour ne sélectionner que les fichiers avec l'extension JPG filter 18,"Fichier photo *.JPG|*.jpg" end_sub ' ------------------------------------------------------------------------------ redim0: ' en cas de tentative de redimensionnement de la fenêtre principale, on rétablit sa taille d'origine 1000x650 inactive 0 width 0,width(0) - width_client(0) + 1000 height 0,height(0) - height_client(0) + 670 active 0 return ' ------------------------------------------------------------------------------ rechercherPhoto: ' inhibition du bouton "Rechercher une photo" inactive 2 ' Afficher la boite de dialogue pour sélectionner un fichier JPEG nomFichier$ = file_name$(18)
' si l'utilisateur annule sa recherche if nomFichier$ = "_" active 2 :' activation bouton "Rechercher une photo" return end_if
chargerPhoto() return ' ------------------------------------------------------------------------------ sub chargerPhoto() ' effacer les MEMOs clear 5 clear 7
' mise à jour historique if premierePhotoAnalysee% = 1 miseAJourHistorique() end_if premierePhotoAnalysee% = 1 nomFichierPhotoActif$ = nomFichier$
' afficher le nom de fichier de la photo sous la vignette caption 15,file_extract_name$(nomFichierPhotoActif$)
' mise à jour barre d'état caption 17,nomFichierPhotoActif$ left 17,(width_client(0) - text_width(nomFichierPhotoActif$,17))/2 lancerLectureMetadonnees()
' modification du ratio du PICTURE 4 en fonction de celui de la photo ratio = largeur% / hauteur% if ratio >= 1 :' photo prise en mode paysage left 4,0 width 4,160 height 4,160 / ratio ' centrage du PICTURE sur le PANEL top 4,(107 - height(4)) / 2 else :' photo prise en mode portrait top 4,0 height 4,107 width 4,107 * ratio ' centrage du PICTURE sur le PANEL left 4,(160 - width(4)) / 2 end_if
' afficher la photo file_load 4,nomFichierPhotoActif$
active 2 :' activer le bouton "Rechercher une photo" end_sub ' ------------------------------------------------------------------------------ sub lancerLectureMetadonnees() dim_local hexa1$, hexa2$, marqueur%, tailleContenu%, octetMarqueur1%, octetMarqueur2% dim_local octetTaille1%, octetTaille2%, essai% ' ouvrir en lecture le fichier de la photo sélectionné dans la boite de dialogue filebin_open_read 19,nomFichierPhotoActif$
' lecture des 2 premiers octets octetMarqueur1% = filebin_read(19) octetMarqueur2% = filebin_read(19)
' Vérification des deux premiers octets : marqueur SOI (Start Of Image), 0xFFD8 pour un fichier JPEG if octetMarqueur1% <> 255 and octetMarqueur2% <> 216 item_add 5,"Erreur : Le marqueur SOI (Start Of Image) n'est pas correct" item_add 5,"Valeur attendue : 0xFFD8" ' conversion en HEXA des valeurs lues hexa1$ = hex$(octetMarqueur1%) if len(hexa1$) = 1 hexa1$ = "0" + hexa1$ end_if hexa2$ = hex$(octetMarqueur2%) if len(hexa2$) = 1 hexa2$ = "0" + hexa2$ end_if ' affichage des valeurs lues item_add 5,"Valeur lue : 0x" + hexa1$ + hexa2$ item_add 5,"Analyse terminée" item_add 5,"" item_add 5,"Choisissez une autre image !"
' fermer le fichier filebin_close 19 exit_sub end_if
' affichage de la réussite de l'autentification d'un fichier JPEG item_add 5,"Le marqueur SOI (Start Of Image) est correct : 0xFFD8"
' lecture des marqueurs suivants (2 octets) et de la taille de leur contenu (2 octets) ' jusqu'à trouver le marqueur SOS (Start Of Scan) de valeur 0xFFDA. ' Au bout de 25 tours de boucle, si le SOS n'est pas trouvé, on arrête de chercher : le fichier est probablement corrompu. essai% = 1
repeat octetMarqueur1% = filebin_read(19) octetMarqueur2% = filebin_read(19) octetTaille1% = filebin_read(19) octetTaille2% = filebin_read(19) marqueur% = (octetMarqueur1% * 256) + octetMarqueur2% tailleContenu% = (octetTaille1% * 256) + octetTaille2%
' affichage des marqueurs et de leur taille item_add 5,"Marqueur 0x" + hex$(marqueur%) + " Taille du contenu :" + str$(tailleContenu%) + " octets" ' sortie du la boucle au bout de 25 itérations essai% = essai% + 1 if essai% = 25 item_add 5,"" item_add 5,"Fichier JPEG corrompu. Fin de l'analyse." exit_repeat end_if
' décodage marqueurs de base 0xFFCx (SOF : Start Of File x) if marqueur% > 65471 and marqueur% < 65476 :' 0xFFC0, 0xFFC1, 0xFFC2 et 0xFFC3 ' charger dans le buffer le contenu de 0xFFC0 filebin_block_read 19,tailleContenu%,buffer%(0) decodageContenu0xFFCx() ' repositionner l'index du fichier binaire à sa position précédente filebin_position 19,filebin_pos(19) - tailleContenu% end_if
' décodage APP0 marqueur 0xFFE0 JFIF if marqueur% = 65504 :' 0xFFE0 ' charger dans le buffer le contenu de 0xFFE0 filebin_block_read 19,tailleContenu%,buffer%(0) decodageContenu0xFFE0() ' repositionner l'index du fichier binaire à sa position précédente filebin_position 19,filebin_pos(19) - tailleContenu% end_if ' décodage APP1 marqueur 0xFFE1 EXIF if marqueur% = 65505 :' 0xFFE1 ' charger dans le buffer le contenu de 0xFFE1 filebin_block_read 19,tailleContenu%,buffer%(0) decodageContenu0xFFE1() ' repositionner l'index du fichier binaire à sa position précédente filebin_position 19,filebin_pos(19) - tailleContenu% end_if
' saut vers le prochain marqueur filebin_position 19,filebin_pos(19) + tailleContenu% - 2 until marqueur% = 65498 :' 0xFFDA
' fermer le fichier filebin_close 19 end_sub ' ------------------------------------------------------------------------------ sub decodageContenu0xFFCx() ' décodage des deux seules données pertinentes pour l'utilsateur : hauteur et largeur image
' hauteur de l'image en pixels hauteur% = buffer%(1) * 256 + buffer%(2)
' largeur de l'image en pixels largeur% = buffer%(3) * 256 + buffer%(4)
' affichage des informations item_add 7,"- - D O N N E E S JPEG : - -" item_add 7,"Largeur de l'image : " + str$(largeur%) + " pixels" item_add 7,"Hauteur de l'image : " + str$(hauteur%) + " pixels" item_add 7,string$(85,"-") end_sub ' ------------------------------------------------------------------------------ sub decodageContenu0xFFE0() ' décodage uniquement des données du segment JFIF. Le segment JFXX n'a pas d'intérêt pour l'utilisateur
dim_local identifiant$
' vérification identifiant : chaine ascii "JFIF" terminée par un octet nul (0x4A46494600) identifiant$ = chr$(buffer%(0)) + chr$(buffer%(1)) + chr$(buffer%(2)) + chr$(buffer%(3)) if identifiant$ <> "JFIF" or buffer%(4) <> 0 end_sub end_if ' affichage item_add 7,"- - D O N N E E S JFIF : - -" ' version JFIF item_add 7,"Version JFIF : " + str$(buffer%(5)) + "." + str$(buffer%(6))
' densité de la photo if buffer%(7) = 1 item_add 7,"Densité X (horizontal) : " + str$(buffer%(8) * 256 + buffer%(9)) + " pixels par pouce" item_add 7,"Densité Y (vertical) : " + str$(buffer%(10) * 256 + buffer%(11)) + " pixels par pouce" end_if
if buffer%(7) = 2 item_add 7,"Densité X (horizontal) : " + str$(buffer%(8) * 256 + buffer%(9)) + " pixels par centimètre" item_add 7,"Densité Y (vertical) : " + str$(buffer%(10) * 256 + buffer%(11)) + " pixels par centimètre" end_if
item_add 7,string$(85,"-") end_sub ' ------------------------------------------------------------------------------ sub decodageContenu0xFFE1() ' décodage des métadonnées EXIF
dim_local identifiant$, decalage%, nombreEntrees%, adresseDeBase%, n% dim_local numeroBalise%, offset%, formatDonnees%, nombreComposants%
' vérification identifiant : chaine ascii "Exif" terminée par deux octets nuls (0x457869660000) identifiant$ = chr$(buffer%(0)) + chr$(buffer%(1)) + chr$(buffer%(2)) + chr$(buffer%(3)) if identifiant$ <> "Exif" or buffer%(4) <> 0 or buffer%(5) <> 0 end_sub end_if ' affichage item_add 7,"- - D O N N E E S EXIF : - -"
' identification de l'alignement des octets : INTEL (Little endian) ou MOTOROLA (Big endian) (2 octets) if buffer%(6) = 77 and buffer%(7) = 77 :' 0x4D4D = "MM" pour MOTOROLA intel% = 0 item_add 5,"L'alignement des octets est MOTOROLA (Big endian)" else if buffer%(6) = 73 and buffer%(7) = 73 :' 0x4949 = "II" pour INTEL intel% = 1 item_add 5,"L'alignement des octets est INTEL (Little endian)" else item_add 5,"Fichier corrompu : impossible de déterminer l'alignement des octets" item_add 5,"Fin du traitement des données EXIF" exit_sub end_if end_if
' mémorisation de l'adresse de base EXIF dans la variable adresseDeBase% adresseDeBase% = 6
' vérification de la conformité de l'alignement des octets (balise de 2 octets) : ' 0x2A00 pour INTEL (Little endian) ' 0x002A pour MOTOROLA (Big endian) if intel% = 1 :' alignement des octets INTEL (2 octets) if buffer%(8) <> 42 or buffer%(9) <> 0 item_add 5,"L'alignement INTEL des octets est corrompu" item_add 5,"Fin du traitment des données EXIF" exit_sub end_if end_if if intel% = 0 :' alignement de octets MOTOROLA (2 octets) if buffer%(8) <> 0 or buffer%(9) <> 42 item_add 5,"L'alignement MOTOROLA des octets est corrompu" item_add 5,"Fin du traitment des données EXIF" exit_sub end_if end_if ' lecture du décalage vers le premier répertoire d'image (IFD0:Image File Directory 0) (4 octets) if intel% = 0 :' alignement des octets MOTOROLA (Big endian) decalage% = (buffer%(10)*16777216) + (buffer%(11)*65536) + (buffer%(12)*256) + buffer%(13) else :' alignement des octets INTEL (Little endian) decalage% = buffer%(10) + (buffer%(11)*256) + (buffer%(12)*65536) + (buffer%(13)*16777216) end_if
offset% = adresseDeBase% + decalage%
' lecture du nombre d'entrées (balises) dans le répertoire IFD0 (2 octets) if intel% = 0 :' alignement des octets MOTOROLA (Big endian) nombreEntrees% = (buffer%(offset%)*256) + buffer%(offset%+1) else :' alignement des octets INTEL (Little endian) nombreEntrees% = buffer%(offset%) + (buffer%(offset%+1)*256) end_if
' affichage du nombre d'entrées (balises) du répertoire IFD0 item_add 5,"Le répertoire IFD0 contient " + str$(nombreEntrees%) + " balises."
offset% = offset% + 2 ' lire les entrées du repertoire image IFD0 pour un alignement des octets MOTOROLA (Big endian) if intel% = 0 for n% = 1 to nombreEntrees% numeroBalise% = (buffer%(offset%)*256) + buffer%(offset%+1) :' 2 octets afficherNumeroBalise(numeroBalise%) formatDonnees% = (buffer%(offset%+2)*256) + buffer%(offset%+3) :' 2 octets nombreComposants% = (buffer%(offset%+4)*16777216) + (buffer%(offset%+5)*65536) + (buffer%(offset%+6)*256) + buffer%(offset%+7) :' 4 octets afficherDetailsBalise(numeroBalise%,formatDonnees%,nombreComposants%,offset%,adresseDeBase%) offset% = offset% + 12 next n% end_if ' lire les entrées du repertoire image IFD0 pour un alignement des octets INTEL (Little endian) if intel% = 1 for n% = 1 to nombreEntrees% numeroBalise% = buffer%(offset%) + (buffer%(offset%+1)*256) :' 2 octets afficherNumeroBalise(numeroBalise%) formatDonnees% = buffer%(offset%+2) + (buffer%(offset%+3)*256) :' 2 octets nombreComposants% = buffer%(offset%+4) + (buffer%(offset%+5)*256) + (buffer%(offset%+6)*65536) + (buffer%(offset%+7)*16777216) :' 4 octets afficherDetailsBalise(numeroBalise%,formatDonnees%,nombreComposants%,offset%,adresseDeBase%) offset% = offset% + 12 next n% end_if item_add 5,"" item_add 7,string$(85,"-") end_sub ' ------------------------------------------------------------------------------ sub afficherNumeroBalise(n%) dim_local hexa$
hexa$ = hex$(n%)
while len(hexa$) < 4 hexa$ = "0" + hexa$ end_while
item_add 5,"Balise 0x" + hexa$ end_sub ' ------------------------------------------------------------------------------ sub afficherDetailsBalise(numeroBalise%,formatDonnees%,nombreComposants%,offset%,adresseDeBase%) dim_local datas$, n%, decalage%, pointeur%, numerateur%, denominateur%
select numeroBalise% case 256 :' 0x0100 format de données : 3, court non signé ou 4, long non signé if intel% = 1 datas$ = str$(buffer%(offset%+8) + (buffer%(offset%+9)*256) + (buffer%(offset%+10)*65536) + (buffer%(offset%+11)*16777216)) else datas$ = str$((buffer%(offset%+8)*16777216) + (buffer%(offset%+9)*65536) + (buffer%(offset%+10)*256) + buffer%(offset%+11)) end_if item_add 7,"Largeur image en pixels : " + datas$
case 257 :' 0x0101 format de données : 3, court non signé ou 4, long non signé if intel% = 1 datas$ = str$(buffer%(offset%+8) + (buffer%(offset%+9)*256) + (buffer%(offset%+10)*65536) + (buffer%(offset%+11)*16777216)) else datas$ = str$((buffer%(offset%+8)*16777216) + (buffer%(offset%+9)*65536) + (buffer%(offset%+10)*256) + buffer%(offset%+11)) end_if item_add 7,"Hauteur image en pixels : " + datas$
case 271 :' 0x010F format de données : 2, ascii if intel% = 1 decalage% = buffer%(offset%+8) + (buffer%(offset%+9)*256) + (buffer%(offset%+10)*65536) + (buffer%(offset%+11)*16777216) else decalage% = str$((buffer%(offset%+8)*16777216) + (buffer%(offset%+9)*65536) + (buffer%(offset%+10)*256) + buffer%(offset%+11)) end_if pointeur% = adresseDeBase% + decalage% for n% = 1 to nombreComposants% datas$ = datas$ + chr$(buffer%(pointeur%)) pointeur% = pointeur% + 1 next n% item_add 7,"Fabricant : " + datas$
case 272 :' 0x0110 format de données : 2, ascii if intel% = 1 decalage% = buffer%(offset%+8) + (buffer%(offset%+9)*256) + (buffer%(offset%+10)*65536) + (buffer%(offset%+11)*16777216) else decalage% = str$((buffer%(offset%+8)*16777216) + (buffer%(offset%+9)*65536) + (buffer%(offset%+10)*256) + buffer%(offset%+11)) end_if pointeur% = adresseDeBase% + decalage% for n% = 1 to nombreComposants% datas$ = datas$ + chr$(buffer%(pointeur%)) pointeur% = pointeur% + 1 next n% item_add 7,"Modèle : " + datas$
case 282 :' 0x011A format de données : 5, rationnel non signé if intel% = 1 decalage% = buffer%(offset%+8) + (buffer%(offset%+9)*256) + (buffer%(offset%+10)*65536) + (buffer%(offset%+11)*16777216) else decalage% = str$((buffer%(offset%+8)*16777216) + (buffer%(offset%+9)*65536) + (buffer%(offset%+10)*256) + buffer%(offset%+11)) end_if pointeur% = adresseDeBase% + decalage% ' lecture numérateur (4 octets) if intel% = 1 numerateur% = buffer%(pointeur%) + (buffer%(pointeur%+1)*256) + (buffer%(pointeur%+2)*65536) + (buffer%(pointeur%+3)*16777216) else numerateur% = (buffer%(pointeur%)*16777216) + (buffer%(pointeur%+1)*65536) + (buffer%(pointeur%+2)*256) + buffer%(pointeur%+3) end_if ' lecture dénominateur (4 octets) if intel% = 1 denominateur% = buffer%(pointeur%+4) + (buffer%(pointeur%+5)*256) + (buffer%(pointeur%+6)*65536) + (buffer%(pointeur%+7)*16777216) else denominateur% = (buffer%(pointeur%+4)*16777216) + (buffer%(pointeur%+5)*65536) + (buffer%(pointeur%+6)*256) + buffer%(pointeur%+7) end_if item_add 7,"Densité horizontale : " + str$(numerateur% / denominateur%)
case 283 :' 0x011B format de données : 5, rationnel non signé if intel% = 1 decalage% = buffer%(offset%+8) + (buffer%(offset%+9)*256) + (buffer%(offset%+10)*65536) + (buffer%(offset%+11)*16777216) else decalage% = (buffer%(offset%+8)*16777216) + (buffer%(offset%+9)*65536) + (buffer%(offset%+10)*256) + buffer%(offset%+11) end_if pointeur% = adresseDeBase% + decalage% ' lecture numérateur (4 octets) if intel% = 1 numerateur% = buffer%(pointeur%) + (buffer%(pointeur%+1)*256) + (buffer%(pointeur%+2)*65536) + (buffer%(pointeur%+3)*16777216) else numerateur% = (buffer%(pointeur%)*16777216) + (buffer%(pointeur%+1)*65536) + (buffer%(pointeur%+2)*256) + buffer%(pointeur%+3) end_if ' lecture dénominateur (4 octets) if intel% = 1 denominateur% = buffer%(pointeur%+4) + (buffer%(pointeur%+5)*256) + (buffer%(pointeur%+6)*65536) + (buffer%(pointeur%+7)*16777216) else denominateur% = (buffer%(pointeur%+4)*16777216) + (buffer%(pointeur%+5)*65536) + (buffer%(pointeur%+6)*256) + buffer%(pointeur%+7) end_if item_add 7,"Densité verticale : " + str$(numerateur% / denominateur%)
case 296 :' 0x0128 format de données : 3, court non signé if intel% = 1 datas$ = str$(buffer%(offset%+8) + (buffer%(offset%+9)*256)) else datas$ = str$((buffer%(offset%+8)*256) + buffer%(offset%+9)) end_if if datas$ = "2" datas$ = "pixels par pouce" else if datas$ = "3" datas$ = "pixels par centimètre" else datas$ = "sans unité" end_if end_if item_add 7,"Unité de résolution : " + datas$ case 306 :' 0x0132 format de données : 2, ascii if intel% = 1 decalage% = buffer%(offset%+8) + (buffer%(offset%+9)*256) + (buffer%(offset%+10)*65536) + (buffer%(offset%+11)*16777216) else decalage% = str$((buffer%(offset%+8)*16777216) + (buffer%(offset%+9)*65536) + (buffer%(offset%+10)*256) + buffer%(offset%+11)) end_if pointeur% = adresseDeBase% + decalage% for n% = 1 to nombreComposants% datas$ = datas$ + chr$(buffer%(pointeur%)) pointeur% = pointeur% + 1 next n% item_add 7,"Date Heure modif : " + datas$ end_select end_sub ' ------------------------------------------------------------------------------ sub miseAJourHistorique() ' mise à jour vignette photo n+2 if nomfichierPhoto_1$ <> "" width 12,width(10) height 12,height(10) top 12,top(10) left 12,left(10) file_load 12,nomfichierPhoto_1$ active 12 end_if ' mise à jour vignette photo n+1 width 10,width(4) height 10,height(4) top 10,top(4) left 10,left(4) file_load 10,nomFichierPhotoActif$ active 10
nomfichierPhoto_2$ = nomfichierPhoto_1$ nomfichierPhoto_1$ = nomFichierPhotoActif$ caption 13,file_extract_name$(nomfichierPhoto_1$) caption 14,file_extract_name$(nomfichierPhoto_2$) end_sub ' ------------------------------------------------------------------------------ chargerPhotoHistorique1: inactive 10 inactive 12 nomFichier$ = nomfichierPhoto_1$ chargerPhoto() active 10 active 12 return ' ------------------------------------------------------------------------------ chargerPhotoHistorique2: inactive 10 inactive 12 nomFichier$ = nomfichierPhoto_2$ chargerPhoto() active 10 active 12 return ' ------------------------------------------------------------------------------ ' Notes : ' ' objet 0 : FORM fenêtre principale ' objet 1 : ALPHA titre ' objet 2 : BUTTON bouton de chargement fichier image Jpeg ' objet 3 : PANEL support d'affichage pour le PICTURE 4 ' objet 4 : PICTURE affichage de la photo sélectionnée ' objet 5 : MEMO affichage des données techniques ' objet 6 : ALPHA titre de la zone d'affichage des données EXIF ' objet 7 : MEMO affichage des données techniques ' objet 8 : ALPHA titre de la zone d'affichage des données EXIF ' objet 9 : PANEL support d'affichage pour le PICTURE 10 ' objet 10: PICTURE affichage de la dernière photo analysée ' obket 11: PANEL support d'affichage pour le PICTURE 12 ' objet 12: PICTURE affichage de l'avant dernière photo analysée ' objet 13: ALPHA ligne d'affichage du nom de la photo n-1 (historique) ' objet 14: ALPHA ligne d'affichage du nom de la photo n-2 (historique) ' objet 15: ALPHA ligne d'affichage du nom de la photo en cours d'analyse ' objet 16: ALPHA ligne d'affichage légende "Historique :" ' objet 17: ALPHA ligne d'affichage de la barre d'état (en bas de la fenêtre) ' objet 18: OPEN_DIALOG_PIC boite de dialogue pour sélectionner un fichier image ' objet 19: FILEBIN_OPEN_READ ' objet 91: PICTURE habillage purement esthétique du PANEL 9 ' objet 92: PICTURE habillage purement esthétique du PANEL 11 ' objet 93: PICTURE habillage purement esthétique du PANEL 3 '
Bonne journée à tous ! Pour rappel, tous les codes que je publie appartiennent de fait à la communauté. Libre à vous de les utiliser en partie ou en totalité, de les modifier, de les améliorer, de les rediffuser...EDIT : Ajout de la prise en charge des marqueurs 0xFFC1 et 0xFFC3.
Dernière édition par Marc le Jeu 13 Juil 2023 - 21:25, édité 1 fois | |
|