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 :

Données de type IMAGE dans Delphi et SQLSever


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 55
    Points : 41
    Points
    41
    Par défaut Données de type IMAGE dans Delphi et SQLSever
    Bonsoir tout le monde,
    Bon voila je souhaiterai apprendre à manipuler des données de type image avec le SGBD "SqlServer 2005" et les charger dans une application "Delphi 7".
    J'ai beaucoup chercher dans les forums sans rien trouver.

    Merci beaucoup.
    bonsoir.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par typhon_186 Voir le message
    J'ai beaucoup chercher dans les forums sans rien trouver.
    Une image n'est qu'un blob donc FAQ
    ceci étant ce qui fonctionne pour un fichier de type BMP ne fonctionne pas pour d'autres types d'image (dommage d'ailleurs que l'équipe delphi n'ai rien fait a ce sujet depuis le temps) .

    après avoir chercher (et trouver) sur le net voici ma solution (pas forcément la meilleure) Avantage : je peux charger un bmp,jpeg,png ou un gif via un LoadFromFile dans le TImage , l'image sera stockée dans le format original

    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
     
    uses ... Graphic, GIFImg, Jpeg,pngimage, DB,
     
    // afficher
    procedure DBImage(I : TImage ; D: TDataset; F : TField);
    var
    m : TStream;
    FirstBytes: AnsiString;
    begin
    if F.IsNull then Exit;
    m := D.CreateBlobStream(F,bmRead);
    if m <> nil then
     begin
     try
      SetLength(FirstBytes, 8);
      m.Read(FirstBytes[1], 8);
      if Copy(FirstBytes, 1, 2) = 'BM' then I.Picture.Graphic := TBitmap.Create
      else
       if FirstBytes = #137'PNG'#13#10#26#10
          then I.Picture.Graphic := TPngImage.Create
       else
       if Copy(FirstBytes, 1, 3) = 'GIF'
          then I.Picture.Graphic := TGIFImage.Create
       else if Copy(FirstBytes, 1, 2) = #$FF#$D8
            then I.Picture.Graphic := TJPEGImage.Create;
      try
       m.Seek(0,0);
       I.Picture.Graphic.LoadFromStream(m);
      except
      end;
     finally
       m.Free;
     end;
     end;
    end;
     
    // écrire
    procedure Image2DB(I : TImage ; D: TDataset; F : TField);
    var
    m : TStream;
    begin
    m := D.CreateBlobStream(F,bmRead);
    if m <> nil then
     begin
     try
       if not i.Picture.Graphic.Empty  then i.Picture.Graphic.SaveToStream(m);
       if not i.Picture.Bitmap.Empty   then i.Picture.Bitmap.SaveToStream(m);
       TBlobField(F).LoadFromStream(m);
     finally
       m.Free;
     end;
     end;
    end;
    utilisation

    Code Lecture : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Dans un évènement afterscroll par exemple
    // LHImage = TImage pas TDBImage
    
    //ZMagasin = TQuery ou TTable ou .... 
     
    DBImage(LHImage,ZMagasin,ZMagasin.FieldByName('LOGOHAUT'));

    Code Ecriture : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // dans un évènement beforePost par exemple 
        Image2DB(LHImage,ZMagasin,ZMagasin.FieldByName('LOGOHAUT'));
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 456
    Points : 24 868
    Points
    24 868
    Par défaut
    As-tu commencé par le Basique ?

    ADOConnexion
    ADOQuery - SELECT * FROM TableAvecImage
    DataSource
    DBGrid
    TDBImage - connecté que le Champ Image

    Si c'est un BMP, cela fonctionne tout seul sans aucun effort
    Vérifie que ton Champ est bien un TBlobField (voir si TGraphicField est applicable)


    Comment insérer et récupérer un fichier dans un champ de type BLOB ?
    Une fois que tu as un Stream comme le montre SergioMaster, tu peux tout faire, tu peux même zip le contenu (ce que je fais toujours pour stocker PDF, Doc, XLS, ou même XML)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Bonsoir et merci pour vos réponse.




    Citation Envoyé par SergioMaster Voir le message
    Une image n'est qu'un blob donc FAQ
    ceci étant ce qui fonctionne pour un fichier de type BMP ne fonctionne pas pour d'autres types d'image (dommage d'ailleurs que l'équipe delphi n'ai rien fait a ce sujet depuis le temps) .

    après avoir chercher (et trouver) sur le net voici ma solution (pas forcément la meilleure) Avantage : je peux charger un bmp,jpeg,png ou un gif via un LoadFromFile dans le TImage , l'image sera stockée dans le format original

    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
     
    uses ... Graphic, GIFImg, Jpeg,pngimage, DB,
     
    // afficher
    procedure DBImage(I : TImage ; D: TDataset; F : TField);
    var
    m : TStream;
    FirstBytes: AnsiString;
    begin
    if F.IsNull then Exit;
    m := D.CreateBlobStream(F,bmRead);
    if m <> nil then
     begin
     try
      SetLength(FirstBytes, 8);
      m.Read(FirstBytes[1], 8);
      if Copy(FirstBytes, 1, 2) = 'BM' then I.Picture.Graphic := TBitmap.Create
      else
       if FirstBytes = #137'PNG'#13#10#26#10
          then I.Picture.Graphic := TPngImage.Create
       else
       if Copy(FirstBytes, 1, 3) = 'GIF'
          then I.Picture.Graphic := TGIFImage.Create
       else if Copy(FirstBytes, 1, 2) = #$FF#$D8
            then I.Picture.Graphic := TJPEGImage.Create;
      try
       m.Seek(0,0);
       I.Picture.Graphic.LoadFromStream(m);
      except
      end;
     finally
       m.Free;
     end;
     end;
    end;
     
    // écrire
    procedure Image2DB(I : TImage ; D: TDataset; F : TField);
    var
    m : TStream;
    begin
    m := D.CreateBlobStream(F,bmRead);
    if m <> nil then
     begin
     try
       if not i.Picture.Graphic.Empty  then i.Picture.Graphic.SaveToStream(m);
       if not i.Picture.Bitmap.Empty   then i.Picture.Bitmap.SaveToStream(m);
       TBlobField(F).LoadFromStream(m);
     finally
       m.Free;
     end;
     end;
    end;
    utilisation

    Code Lecture : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Dans un évènement afterscroll par exemple
    // LHImage = TImage pas TDBImage
    
    //ZMagasin = TQuery ou TTable ou .... 
     
    DBImage(LHImage,ZMagasin,ZMagasin.FieldByName('LOGOHAUT'));

    Code Ecriture : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // dans un évènement beforePost par exemple 
        Image2DB(LHImage,ZMagasin,ZMagasin.FieldByName('LOGOHAUT'));

    Sergio, ton code n'a pas voulu marcher, delpgi me di que
    GIFImg.dcu, Jpeg.dcu,pngimage.dcu non trouvé





    @LeTroll: Justement, je n'ai jamais travaillé avec ce BLOB, je ne sais meme pas m'en servir, d'ailleur je sais pas si c'est un composant ou autre chose.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 456
    Points : 24 868
    Points
    24 868
    Par défaut
    Comme je le disais commence par les choses simples !
    Regarde la Démo FishFact (c'est exactement la même chose en InterBase), c'est un basique
    Je peux te lire, j'ai commencé par faire le tutoriel FishFact de Delphi 4 avec BDE\Paradox, le TDBImage et le chargement d'image, j'ai du le faire au bout de quelques heures (c'était la 1ere fois que j'utilisais Delphi !)

    As-tu lu la FAQ - Comment insérer et récupérer un fichier dans un champ de type BLOB ?
    Couplé avec un TOpenDialog (ou TOpenPictureDialog), tu pourras facilement modifier ta table d'image !
    Passe par la propriété Field du TDBImage, tu transype celui-ci en TBlobField pour utiliser LoadFromFile comme dans la FAQ !

    Pour Delphi 7, commence par le Bitmap simple, le code fourni par SergioMaster c'est au minimum du 2010 ou XE !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Salut,
    Merci ShaiLeTroll pour ta réponse, j'ai pu faire l'insertion, mais pour l'affichage dans un composant DBImage, je n'y arrive toujours pas

    merci bcp

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 456
    Points : 24 868
    Points
    24 868
    Par défaut
    Ton DBImage est bien connecté sur le DataSource ?
    Tu as bien renseigné DataField avec le nom du champ ?

    Si ton image a été inséré c'est que c'est bien un TBlobField, en théorie TDBImage devrait l'afficher, lui faut-il un TGraphicField ?

    Sinon, tu peux le faire avec un simple TImage en allégant le code de SergioMaster

    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
    procedure LoadDBImage(I : TImage ; D: TDataset; F : TField);
    var
      m : TStream;
    begin
      if F.IsNull then 
        Exit;
     
      m := D.CreateBlobStream(F,bmRead);
      if m <> nil then
      try
        I.Picture.Bitmap.LoadFromStream(m);
      finally
        m.Free;
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    GIFImg.dcu, Jpeg.dcu,pngimage.dcu non trouvé
    Delphi7 n'a peut être pas ces unités

    1) jpeg est peut être plutôt connue comme jpg
    2) png delphi 7 ne le connais pas c'est sur , sous D7 il faudra faire une recherche
    3) pour les formats gif aucune idée

    Le code était pour D2006 +
    comme le suggère Shai allèges le code pour n'inclure que les formats images utilisés . Je suis absolument sur que le jpg est supporté , sous D7 j'avais également trouvé une biblio/unité pour les png
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Autrement sous delphi 7 on peut utiliser la bibliothèque GraphicEx
    http://delphi.developpez.com/freewar...ismeMultimedia

    Elle permet de gérer pas mal de formats d'image.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 130
    Points : 95
    Points
    95
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure LoadDBImage(I : TImage ; D: TDataset; F : TField);
    var
      m : TStream;
    begin
      ........
      .........
        m.Free;
      end;
    end;
    Merci ShaiLeTroll, ça m'as été très utile

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 456
    Points : 24 868
    Points
    24 868
    Par défaut
    Mais de rien, j'ai fourni la même réponse ce matin : Afficher un champs BLOB dans TImage en C++Builder

    ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Charger données type IMAGE dans GRIDVIEW
    Par mouadmagan dans le forum ASP.NET
    Réponses: 9
    Dernier message: 29/06/2011, 14h55
  2. Traduction de données de type caractère dans Hibernate
    Par dev-man dans le forum Hibernate
    Réponses: 6
    Dernier message: 20/11/2006, 12h48
  3. Réponses: 4
    Dernier message: 29/08/2006, 14h52
  4. Réponses: 2
    Dernier message: 03/11/2005, 20h26
  5. Champ de type "Image" dans SQL Server
    Par Edouard Kaiser dans le forum ASP
    Réponses: 5
    Dernier message: 09/09/2005, 07h43

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