pictogram Auteur : Patrick Biker
Date : 12 Nov 2005
Révision: 15 nov 2005

Lecture de la vignette DCF / EXIF en WLangage

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)