FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Logiciel de planétarium.
PHOTO : JPEG JFIF EXIF Emptypar Pedro Aujourd'hui à 10:37

» Un autre pense-bête...
PHOTO : JPEG JFIF EXIF Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
PHOTO : JPEG JFIF EXIF Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
PHOTO : JPEG JFIF EXIF Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
PHOTO : JPEG JFIF EXIF Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
PHOTO : JPEG JFIF EXIF Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
PHOTO : JPEG JFIF EXIF Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
PHOTO : JPEG JFIF EXIF Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
PHOTO : JPEG JFIF EXIF Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
PHOTO : JPEG JFIF EXIF Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
PHOTO : JPEG JFIF EXIF Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
PHOTO : JPEG JFIF EXIF Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
PHOTO : JPEG JFIF EXIF Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
PHOTO : JPEG JFIF EXIF Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
PHOTO : JPEG JFIF EXIF Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le deal à ne pas rater :
Boutique Nike : -25% dès 50€ sur TOUT le site Nike avec le code ...
Voir le deal

 

 PHOTO : JPEG JFIF EXIF

Aller en bas 
2 participants
AuteurMessage
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

PHOTO : JPEG JFIF EXIF Empty
MessageSujet: PHOTO : JPEG JFIF EXIF   PHOTO : JPEG JFIF EXIF EmptyJeu 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.

PHOTO : JPEG JFIF EXIF Metado10


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
Revenir en haut Aller en bas
jjn4

jjn4


Nombre de messages : 2747
Date d'inscription : 13/09/2009

PHOTO : JPEG JFIF EXIF Empty
MessageSujet: Re: PHOTO : JPEG JFIF EXIF   PHOTO : JPEG JFIF EXIF EmptyLun 5 Juin 2023 - 14:33

Ouaaahhh !
Un super beau truc !!!
Et ça marche pour toutes les photos jpg possibles ?
cheers scratch study
Revenir en haut Aller en bas
http://jjn4.e-monsite.com
jjn4

jjn4


Nombre de messages : 2747
Date d'inscription : 13/09/2009

PHOTO : JPEG JFIF EXIF Empty
MessageSujet: Re: PHOTO : JPEG JFIF EXIF   PHOTO : JPEG JFIF EXIF EmptyVen 9 Juin 2023 - 15:57

J'ai essayé avec diverses photos.
Ca marche !
Un petit problème avec les fichiers corrompus :
une erreur à la ligne 275,
que j'ai résolu ainsi :
Code:
' modification du ratio du PICTURE 4 en fonction de celui de la photo
  if hauteur%<>0
      ratio = largeur% / hauteur%
  end_if
Super programme, Marc !
cheers
Revenir en haut Aller en bas
http://jjn4.e-monsite.com
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

PHOTO : JPEG JFIF EXIF Empty
MessageSujet: Re: PHOTO : JPEG JFIF EXIF   PHOTO : JPEG JFIF EXIF EmptyLun 12 Juin 2023 - 12:32

Bonjour à tous !

Merci JJN4 pour tes essais ainsi que d’avoir ajouté une sécurité supplémentaire pour certains fichiers corrompus.

Pour ceux qui sont intéressés d’aller plus loin en ajoutant le décodage d’autres tags (balises), voire de décoder les données subEXIF localisées par le tag 0x8769, je mets ci-dessous un lien vers la documentation que j’ai utilisée au sujet de la norme EXIF :

https://kdrive.infomaniak.com/app/share/698165/d15eb7bb-bbb1-4cf4-8587-71ae0c3814ff

Dans le code-source que j’ai publié ci-dessus (dans le premier post), vous pouvez supprimer la déclaration du tableau buffer2%(65536) en ligne 8.


Bonne programmation à tous !
Revenir en haut Aller en bas
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

PHOTO : JPEG JFIF EXIF Empty
MessageSujet: Re: PHOTO : JPEG JFIF EXIF   PHOTO : JPEG JFIF EXIF EmptyLun 12 Juin 2023 - 14:49

... Suite à mon précèdent post :

@JJN4

Suite à l’erreur que tu as rencontrée sur certaines photos, il faudrait remplacer la ligne 359

Code:
if marqueur% = 65472 or marqueur% = 65474 :' 0xFFC0 et 0xFFC2
     
par celle-ci :

Code:
if marqueur% = 65472 or marqueur% = 65473 or marqueur% = 65474 or marqueur% = 65475:' 0xFFC0 à 0xFFC3
     
Le problème est-il résolu pour les photos concernées ?
Revenir en haut Aller en bas
jjn4

jjn4


Nombre de messages : 2747
Date d'inscription : 13/09/2009

PHOTO : JPEG JFIF EXIF Empty
MessageSujet: Re: PHOTO : JPEG JFIF EXIF   PHOTO : JPEG JFIF EXIF EmptyMar 13 Juin 2023 - 16:09

Ca marche pareil, car ça marchait déjà avant,
simplement avec quelques données un peu bizarres...
Donc, ne te turlupine-pas. De toute façon, si le fichier est corrompu...
scratch
Revenir en haut Aller en bas
http://jjn4.e-monsite.com
Contenu sponsorisé





PHOTO : JPEG JFIF EXIF Empty
MessageSujet: Re: PHOTO : JPEG JFIF EXIF   PHOTO : JPEG JFIF EXIF Empty

Revenir en haut Aller en bas
 
PHOTO : JPEG JFIF EXIF
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Super album photo de famille
» Afficher correctement une image JPEG
» Travaux pratiques: extraction de photo d'identité
» Positionnement GPS photo
» correction de parallaxe de vos photo

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: