Section 4 : Trouver le début de JPEG dans BLOB
Format de type d'objet OLE - prenez-en trois !
Il ne nous reste plus qu'à stocker l'image sur le disque (sous forme de simple fichier binaire) et à comprendre ce qu'elle contient.
Tous les fichiers image (formats) ont des en-têtes de fichier qui identifient l'image de manière unique. Les fichiers image JPG commencent par une balise dite SOI, dont la valeur hexadécimale est $FFD8.
La ligne de code suivante stocke la valeur du champ image dans le fichier approprié (BlobImage.dat) dans le répertoire de travail. Placez ce code dans l'événement OnCreate du formulaire et supprimez-le après avoir démarré le projet.
ADOTable1Picture.SaveToFile('BlobImage.dat');
Une fois que nous avons ce fichier. Nous pouvons utiliser l'éditeur Hex pour visualiser son contenu.
Le croyez-vous ? MS Access stocke le chemin d'accès à l'objet OLE connecté dans le champ de l'objet OLE dans le cadre de la définition de l'objet. Étant donné que la définition de stockage des objets OLE n'est pas documentée (!? Cela vient directement de MS), il n'y a aucun moyen de savoir ce que les données d'image réelles obtiendront avant d'être écrites.
Considérez cette question en deux parties. Premièrement : nous devons trouver « FFD8 » et commencer à lire l'image à partir de là. Deuxièmement : « FFD8 » ne peut pas toujours être à la même position dans le fichier. Conclusion : Nous avons besoin d'une fonction qui renvoie l'emplacement de la balise SOI d'un fichier JPG stocké sous forme d'objet OLE dans la base de données Access.
La bonne façon : prenez-en quatre !
Avec un champ de type Blob fourni, notre fonction doit renvoyer la position de la chaîne 'FFD8' dans ADOBlobStream. ReadBuffer lit les données du flux octet par octet. Chaque appel à ReadBuffer déplace la position du flux octet par octet. La fonction renvoie la position du flux lorsque deux octets mènent ensemble au marqueur SOI. Voici la fonction :
fonction JpegStartsInBlob(PicField:TBlobField):integer;
var
bS : TADOBlobStream ;
tampon : Mot ;
hx : chaîne ;
commencer
Résultat := -1;
bS := TADOBlobStream.Create(PicField, bmRead);
essayer
tandis que (Result = -1) et (bS.Position + 1 < bS.Size) font
commencer
bS.ReadBuffer(tampon, 1);
hx:=IntVersHex(tampon, 2);
si hx = 'FF' alors commencez
bS.ReadBuffer(tampon, 1);
hx:=IntVersHex(tampon, 2);
si hx = 'D8' alors Résultat := bS.Position - 2
sinon si hx = 'FF' alors
bS.Position := bS.Position-1;
fin ; //si
fin ; //pendant
enfin
bS.Gratuit
fin ; //essayer
fin;
Une fois que nous avons l'emplacement du marqueur SOI, nous pouvons l'utiliser pour trouver l'emplacement de l'image dans le flux ADOBlob.
utilise jpeg ;
...
PRocédure TForm1.btnShowImageClick(Expéditeur : TObject);
var
bS : TADOBlobStream ;
Photo : TJpegImage ;
commencer
bS := TADOBlobStream.Create(AdoTable1Picture, bmRead);
essayer
bS.Seek(JpegStartsInBlob(AdoTable1Picture),soFromBeginning);
Pic:=TJpegImage.Create;
essayer
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Pic;
enfin
Pic.Gratuit;
fin;
enfin
bS.Gratuit
fin;
fin;
Exécutez le projet, OK !
Maintenant, qui peut dire que la programmation n’est pas amusante ?
Remarque : Dans le programme de code réel, nous ajouterons du code pour lire et afficher l'image de la ligne actuelle dans l'événement AfterScroll de TDataSet (c'est dans la procédure événementielle ADOTable1AfterScroll). L'événement AfterScroll se produit lorsque l'application passe d'un enregistrement à un autre.
Idée cinq !
C'est de cela que parle ce chapitre. Vous pouvez désormais stocker et afficher toutes les images JPG qui vous intéressent. Sur la dernière page de cet article, je fournirai le code complet (unité form1) ; toute la disposition des données est placée dans l'événement OnCreate du formulaire. Cela garantit que les trois composants sont correctement connectés : vous n'avez pas besoin d'utiliser l'inspecteur d'objets lors de la conception.
Je l'avoue, ce chapitre n'est pas pour les débutants, mais le monde est un endroit cruel ! Autre chose : vous remarquez qu'au final vous ne savez même pas comment modifier (ou ajouter de nouvelles) images au tableau ! Oui, c'est une toute autre histoire !