Auteur : Patrick Biker
Date : 12 Nov 2005
Révision: 15 nov 2005
Code source à copier-coller dans un bouton dans une fenêtre WinDev
// Ouverture du fichier IdFichier est un entier IdFichier = fOuvre("sony.jpg", foLecture) // SI IdFichier = -1 ALORS RETOUR // Un fichier DCF valide débute par une entête // de fichier JPEG de 12 octets de long. // SOI (0xFFD8) + APP1 (OxFFE1) + (2 octets) + "Exif" + 0x0000 // sBuffer est une chaîne fixe sur 12 SI 12 <> fLit(IdFichier, 12, &sBuffer) ALORS GOTO _Erreur // // Controles sur la structure sControle est une chaîne fixe sur 4 sControle = Caract(0xFF)+Caract(0xD8)+Caract(0xFF)+Caract(0xE1) // SI sBuffer[[1 A 4]] <> sControle ALORS GOTO _Erreur SI Position(sBuffer, "Exif") <> 7 ALORS GOTO _Erreur // // lecture du TIFF Header 8 octets = 2 ByteOrder + 2 réservés + 4 offset SI 8 <> fLit(IdFichier, 8, &sBuffer) ALORS GOTO _Erreur // CodageMotorola est un booléen CodageMotorola = (sBuffer[[1 A 2]] = "MM") // // Calcul du décalage decalage est un entier sans signe sur 4 octets // // Pour affecter l'entier, on déplace directement 4 octets du buffer // vers l'adresse de l'entier // SI CodageMotorola ALORS Transfer(&decalage, (&sBuffer + 4), 4) decalage = ConversionMotorola(decalage) SINON Transfer(&decalage, (&sBuffer + 4), 4) FIN // SI decalage > 8 ALORS fPositionne(IdFichier, 12 + decalage, fpDébut) FIN // // Début du IFD nbElement est un entier sur 2 octets SI 2 <> fLit(IdFichier, 2, &nbElement) ALORS GOTO _Erreur SI CodageMotorola ALORS nbElement = ConversionMotorola(nbElement) // // Chaque élément fait 12 octets. On saute ces élément fPositionne(IdFichier, 12 * nbElement, fpCourant) // // Pointeur vers la vignette SI 4 <> fLit(IdFichier, 4, &decalage) ALORS GOTO _Erreur SI CodageMotorola ALORS decalage = ConversionMotorola(decalage) // // Saut vers le IFD vignette SI decalage = 0 ALORS GOTO _Erreur fPositionne(IdFichier, 12 + decalage, fpDébut) // // IFD Vignette SI 2 <> fLit(IdFichier, 2, &nbElement) ALORS GOTO _Erreur SI CodageMotorola ALORS nbElement = ConversionMotorola(nbElement) // // il faut lire tous les éléments pour récuperer la taille, la position // de la vignette dans le fichier tailleVignette est un entier // BOUCLE (nbElement) // Chaque élément a une longeur de 12 octets SI 12 <> fLit(IdFichier, 12, &sBuffer) ALORS GOTO _Erreur // chaque élément est composé de 4 parties : // Tag (2) + Format (2) + Composant (4) + Données (4) // L'élément contenant la taille est désigné par le Tag 0x0202 // SI sBuffer[[1 A 2]] = Caract(2)+Caract(2) ALORS Transfer(&tailleVignette, (&sBuffer + 8), 4) SI CodageMotorola ALORS tailleVignette = ConversionMotorola(tailleVignette) FIN // SI CodageMotorola ALORS SI sBuffer[[1 A 2]] = Caract(2)+Caract(1) ALORS Transfer(&decalage, (&sBuffer + 8), 4) decalage = ConversionMotorola(decalage) FIN SINON SI sBuffer[[1 A 2]] = Caract(1)+Caract(2) ALORS Transfer(&decalage, (&sBuffer + 8), 4) FIN FIN FIN // // Extraction de la vignette SI decalage = 0 ALORS GOTO _Erreur // // On se place au début de la vignette fPositionne(IdFichier, 12 + decalage, fpDébut) // // Buffer spécial pour la vignette sBufferVignette est une chaîne sBufferVignette = Répète(Caract(0), tailleVignette) // SI tailleVignette <> fLit(IdFichier, tailleVignette, &sBufferVignette) ALORS GOTO _Erreur // // On sauve la vignette sur disque fSauveTexte("vignette.jpg", sBufferVignette) // // préparation pour l'affichage dans le champ ImageVignette ImageVignette = "" ImageVignette..Largeur = ExtraitChaîne(InfoBitmap("vignette.jpg"),2) ImageVignette..Hauteur = ExtraitChaîne(InfoBitmap("vignette.jpg"),3) // // Affichage ImageVignette = "vignette.jpg" // // fin normale du traitement fFerme(IdFichier) RETOUR // // gestion des erreurs _Erreur: Erreur("Il y a une erreur") fFerme(IdFichier)