IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

Table SQL, Image et JPG


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut Table SQL, Image et JPG
    Bonjour,

    Voici mon problème, j'utilise D7, et je dois réalisé une extration de donnée de type image.
    J'ai un table dans laquel est stocké un champs de type image et je dois l'extraire sous un format JPEG dans un fichier . J'ai presque 300 000 lignes dans la table et donc 300 000 images a sauvegarder dans des fichiers.

    Mais je n'ai aucune idée par ou prendre le problème et encore moins comment faire. Aussi merci de votre aide. Je dois utilisé un access en mode ODBC

    Merci pour votre aide

    Tornade

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    ou encore la
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Bin apres quelques recherche j'ai pondu ce code, mais qui ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      data.sql1.open;
      data.qatt.open;
      data.qAtt.First;
      while not data.qatt.eof do
      begin
        tblobfield(data.qatt.fieldbyname('at_photo')).SaveToFile(floattostr(data.qAtt.fieldbyname('at_id').Value)+'.jpg');
        data.qAtt.Next;
      end;
    Je n'ai pas utilisé de data stream, car je pensais ne pas en avoir besoin.

    Le code ci dessus fonctionne mais le fichier généré est ilisible

    Merci pour votre aide

    Tornade

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Donc j'ai essayer une autre piste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    var
      ijpg:TJPEGImage;
      ibmp:TBitMap;
      ms:tmemorystream;
    begin
      ms:=tmemorystream.Create;
      ijpg:=TJPEGImage.Create;
      data.sql1.open;
      data.qatt.open;
      data.qAtt.First;
      while not data.qatt.eof do
      begin
      // La photo
        tblobfield(data.qatt.fieldbyname('at_photo')).SaveToStream(ms);
        dbimage1.Picture.Bitmap.LoadFromStream(ms);
        dbimage1.Repaint;
        ijpg.LoadFromStream(ms);
        ijpg.SaveToFile('p'+floattostr(data.qAtt.fieldbyname('at_id').Value)+'.jpg');
        data.qAtt.Next;
      end;
      ms.Free;
      ijpg.Free;
    Je n'ai pas d'erreur lors de l'execution mais j'obtiens un fichier jpeg vide (taille 0 Ko). Auriez vous une idée d'ou vient l'erreur.

    je dois rendre un avis sur la réalisation du projet aujourd'hui, et transmettre quelques images au client.

    Merci pour vos réponses

    je vais continuer a chercher d'autres alternative

    Merci a tous

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par tornade69
    Bin apres quelques recherche j'ai pondu ce code, mais qui ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      data.sql1.open;
      data.qatt.open;
      data.qAtt.First;
      while not data.qatt.eof do
      begin
        tblobfield(data.qatt.fieldbyname('at_photo')).SaveToFile(floattostr(data.qAtt.fieldbyname('at_id').Value)+'.jpg');
        data.qAtt.Next;
      end;
    Je n'ai pas utilisé de data stream, car je pensais ne pas en avoir besoin.

    Le code ci dessus fonctionne mais le fichier généré est ilisible

    Merci pour votre aide

    Tornade
    Es tu sur que ton image est une image Jpg ? et pas un bmp ou un gif ?
    Est ce qeu tu arrive a voir l'image avec un DbImage ? si oui, je te conseil de changer l'extension en Bmp.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Réponse non je ne le vois pas dans le DBImage. Le fichier généré pèse 0 Ko

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Peux tu extraire l'image avec un autre moyen afin de vérifier qu'elle ne soit pas erronée. Car autant tu essais d'ouvrir un fichier non valide.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    J'ai créer une vue pour me permettre de récupéré seulement quelques enregistrements de la base de donnée. J'ai fait un copie coller de la vue sous acces de la base pour en faire une copie local. J'ai créer un formulaire sur la automatique sur la table (copie de la vue), mais impossible de voir ou modifier l'image, lorsque je double click dessus j'obtiens un message d'erreur
    un problème est survenu durant la communication entre Acces et le serveur OLE ou le controle ActiveX.

    Je ne sais pas si c'est ma copie qui est fausse ou si je n'arrive pas exploiter le format JPEG stocker dans la base SQL. Le type de donnée est image !!

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    J'ai créer une table sous SQL Serveur avec 1 champs num, 1 champs image. J'ai insérer 3 lignes avec 3 photos, et la procédure ci dessus ne marche pas. Donc j'ai un bug dans la procédure.

    Soit je fait pas la copie dans le Stream
    Soit je n'ai rien a sauvegarder.

    Quelqu'un a un idée

    Merci pour votre aide

    Tornade

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Bon, j'ai fait de progres, mais il me reste encore une erreur.

    Par contre pour le problèmes des images j'ai trouvé une solution (non pas moi, trouvé sur le web). L'explication est simple lorsque Access ou SQL sauvegarde un blobimage, il concerve dans le champs le chemin d'accès qui a permis de générer le document.
    Pour les explications en VO il suffit de ce rendre sur le site : http://delphi.about.com/od/database/l/aa030601d.htm

    L'info est géniale et a résolue mon problème d'image.

    Donc voici mon nouveau code (a optimiser pour peut etre la la FAQ (moi pas assez fort))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      ijpg:TJPEGImage;
      ibmp:TBitMap;
      stre:TADOBlobStream;
    begin
      data.sql1.open;
      data.qatt.open;
      data.qAtt.First;
      while not data.qatt.eof do
      begin
      // La photo
        try
          stre:=tadoblobstream.Create(tblobfield(data.qatt.fieldbyname('at_photo')),bmRead);
          stre.Seek(jpegstartsinblob(tblobfield(data.qatt.fieldbyname('at_photo'))),soFromBeginning);
          ijpg:=TJPEGImage.Create;
     
            ijpg.LoadFromStream(stre);
         ijpg.SaveToFile('p'+floattostr(data.qAtt.fieldbyname('at_id').Value)+'.jpg');
     
          image1.Picture.Bitmap.LoadFromStream(stre); // Marche pas domage 
          image1.Repaint;
        finally
          stre.Free;
          ijpg.Free;
        end;
        data.qAtt.Next;
     
      end;
    //  ijpg.Free;
     
    end;
    function tform1.JpegStartsInBlob (PicField:TBlobField):integer;
    var
     bS     : TADOBlobStream;
     buffer : Word;
     hx     : string;
    begin
     Result := -1;
     bS := TADOBlobStream.Create(PicField, bmRead);
     try
      while (Result = -1) and (bS.Position + 1 < bS.Size) do
      begin
       bS.ReadBuffer(buffer, 1);
       hx:=IntToHex(buffer, 2);
       if hx = 'FF' then begin
         bS.ReadBuffer(buffer, 1);
         hx:=IntToHex(buffer, 2);
         if hx = 'D8' then Result := bS.Position - 2
         else if hx = 'FF' then bS.Position := bS.Position-1;
       end; //if
      end; //while
     finally
      bS.Free
     end;  //try
    end;
    La lecture ne pose plus de problème, mais j'ai une erreur au bout de la 16 eme image
    EreadError : erreur de lecture de flux sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           ijpg.LoadFromStream(stre);
    Je cherche un moyen pour ne pas gérer cette erreur et passé a l'enregistrement suivant.

    Mais comment faire

    Merci pour votre aide

    Tornade

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Arrange toi pour que la construction et la destruction dynamiques de tes composants se fassent qu'une fois, car la tu le fais pour chaque images et c'est fortement déconseillé.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Oui je suis d'accord, mais il semble que "tadoblobstream" doit etre détruit a chaque fois (c'est ce que j'ai compris de l'aide).
    Mais pour le l'autre de l'image, je vais faire la modif

    Par contre pas d'idee pour intercepté l'erreur et poursuivre le code ??

    Merci

    Tornade

  13. #13
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Rajoute un try ... Except

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     while not data.qatt.eof do
      begin
      // La photo
      try  
        try
          stre:=tadoblobstream.Create(tblobfield(data.qatt.fieldbyname('at_photo')),bmRead);
          stre.Seek(jpegstartsinblob(tblobfield(data.qatt.fieldbyname('at_photo'))),soFromBeginning);
          ijpg:=TJPEGImage.Create;
     
            ijpg.LoadFromStream(stre);
         ijpg.SaveToFile('p'+floattostr(data.qAtt.fieldbyname('at_id').Value)+'.jpg');
     
          image1.Picture.Bitmap.LoadFromStream(stre); // Marche pas domage 
          image1.Repaint;
        finally
          stre.Free;
          ijpg.Free;
        end;
      Except on E:Exception do
        begin
          // tu traites ce que tu veux ici
        end;
      end;
        data.qAtt.Next;
     
      end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

Discussions similaires

  1. [MySQL] images + table SQL : Est-ce que c'est possible ?
    Par SteFX dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 24/03/2011, 14h18
  2. affichage d'une image selon table sql
    Par math8811 dans le forum Langage
    Réponses: 9
    Dernier message: 27/11/2008, 11h53
  3. Supprimer une image dans une table SQL Serveur 2000
    Par Soobook dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/09/2006, 17h00
  4. [C#] Récupération d'une image depuis une table SQL Server
    Par borgfabr dans le forum Accès aux données
    Réponses: 10
    Dernier message: 08/04/2004, 13h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo