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)