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

Delphi Discussion :

Affichage d'une image via une base de données déjà créée.


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 14
    Points
    14
    Par défaut Affichage d'une image via une base de données déjà créée.
    Bonjour à tous,
    J'ai une base de données que j'ai créée sur paradox7 (j'utilise delphi7).
    Dans ma base, j'ai un champ appelé IMAGE constituée d'image bmp de chaque enregistrement. Je voudrais dans mon application, afficher une image
    dans un objet Timage. Je vous donne le code que j'ai écrit :



    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
    Var MS : TMemoryStream;
     
    Begin
     
    MS: TMemoryStream.Create;
     
    With Query1 Do
     
    begin
     
    Active :=False;
    SQL.Clear;
    SQL.Add('Select IMAGE from " Chemin complet de la table" ');
    ExecSQL;
    Active:=True;
    End;
     
    Try
    TBlobField(Query1.FieldByName('IMAGE')).saveToStream(MS);//Sauver  MS.Position:=0;//On se delplace au debut du stream
    Image1.Picture.Bitmap.LoadFromStream(MS);// On affiche l'image
    Finally
    MS.Free;//Liberer la memoire
    end;
     
    end;

    J'ai le message suivant:

    Le projet rangetest.exe a provoqué une classe d'exception EInvalidGraphic
    avec le message Image bitmap incorrecte'. Processus stoppé. Utilisez Pas-pas ou exécuter pour continuer.
    S'il vous plaît, j'ai besoin d'aide car cela des jours que je cherche des solutions.
    Merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    L'erreur vient du fait que tu essaies d'ouvrir un format d'image non pris en compte par le composant TImage (logiquement c'est ce que veut dire l'erreur).

    Ensuite, personnellement je ne fais pas comme toi pour charger mes images (j'ai jamais essayé cette méthode).

    Je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1.Picture.LoadFromFile
    Le soucis, je pense c'est que tu veux affecté une image portant l'extension jpg à un Bitmap ce qui n'est pas bon.

    Ce que je ferai c'est :
    1) Dans la BDD, je fais ma requête
    2) Je lis la colonne comportant le chemin complet de l'image à charger
    3) Je fais un LoadFromFile comme cité ci dessus.

    J'espère que ma réponse te conviendra
    A+

    PS: Penses à mettre les balises de code (le # dans la barre de menu)

  3. #3
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 503
    Points : 2 773
    Points
    2 773
    Billets dans le blog
    10
    Par défaut
    De manière plus simple si tu reprends l'exemple "fishfact.dpr" de borland
    Tu peux ajouter un objet Image1 de type Timage et mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Image1.Picture.Assign(DBImage1.Picture);

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 549
    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 549
    Points : 25 119
    Points
    25 119
    Par défaut
    Peux-tu nous fournir le code qui a écrit l'image, car dans le blob, tu as quoi ? un Bitmap ? un objet TImage stocké comme si il était en DFM, ...


    Sinon Assez, d'accord avec ero-sennin, Au lieu de stocker l'image en blob, la stocker dans dans un sous répertoire de la base par exemple, et mettre le nom du fichier (si partiel, il serait par défaut BASEDIR\IMAGE\..., si complet, ben complet quoi ...) et ensuite faire le LoadFromFile ... sinon tu va tuer tes tables paradox, très rapidement ...
    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

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 14
    Points
    14
    Par défaut Affichage d'une image à partir d'une base de donnée déjà créée
    Je vous envoie le code utilisé pour l'affectation des images bmp à la base de données :
    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
     
    Procedure TForm1.FormCreate(Sender:TObject);
    Var Image 1, Image2, Image3 : TBitmap ;
    Var redrandom1,redrandom2,redrandom3 : String ;
    Var A,B,C: String;
    begin
     
    // Initialisation 
    redrandom1:='redrandom1';
    redrandom2:='redrandom2';
    redrandom3:='redrandom3';
     
    A:='A' ;
    B:='B' ;
    C:='C' ;
     
    // Remplissage de la base de données avec les enregistrements
     
    Image1:=Tbitmap.Create ;
    Image1.LoadfromFile('repertoire+redrandom1.bmp');
    Table1.InsertRecord([1,redrandom1,A,Image1]);
     
    Image2:=Tbitmap.Create ;
    Image2.LoadfromFile('repertoire+redrandom2.bmp');
    Table1.InsertRecord([2,redrandom2,B,Image2]);
     
    Image3:=Tbitmap.Create ;
    Image3.LoadfromFile('repertoire+redrandom1.bmp');
    Table1.InsertRecord([3,redrandom3,C,Image3]);
    end;
    Je rapelle que ma base de données est constituée de quatre champs :
    ORDRE, NOM,ETIQUETTE, et IMAGE respectivement l'ordre dans la base, le nom de chaque image, etiquette (lettre qui apparaitra au survol de la souris) et <BLOB BINAIRE>.
    Merci d'avance

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 549
    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 549
    Points : 25 119
    Points
    25 119
    Par défaut
    Effectivement, tu enregistre tout l'objet, quoi que, je ne sais même pas ce que cela fait ? enregistre le pointeur ? met l'image en Stream ... si c'est bon, j'ai parcouru le code de InsertRecord, cela utilise la persistance (ce que je disais quand j'évoquais la DFM)

    tu devrais vérifier la taille renvoyé par "MS.Size" est bien supérieur à Zéro ou vérifier IsNull ... juste pour la rigueur

    Sinon il me semble qu'InsertRecord fait appel à SetFields pour gérer le remplissage entre un Blob et un TBitMap (qui dérive de TInterfacedPersistent et implémente IStreamPersist)

    essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Image1.Picture.Bitmap.Assign(TBlobField(Query1.FieldByName('IMAGE'))):
    voir si un create avant le assign est nécessaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1.Picture.Bitmap := TBitmap.Create();
    Logiquement le Assign du TBitMap va appeler celui de son ancêtre dans TPersistent, et celui ci devrait appeler le AssignTo de TBlobField qui devrait utiliser TInterfacedPersistent (via IStreamPersist) pour lire le BitMap dans le blob ... bon tu ce que je dis viens de mon étude des unités DB et Graphic ... toujours source d'inspiration ...
    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

  7. #7
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 503
    Points : 2 773
    Points
    2 773
    Billets dans le blog
    10
    Par défaut
    Voilà une procedure qui marche (voir exemple dans le fichier zip ci joint) :
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      Image1 : TBitmap ;
      redrandom1,redrandom2,redrandom3 : String ;
      A,B,C: String;
    begin
    // Initialisation
    redrandom1:='redrandom1';
    redrandom2:='redrandom2';
    redrandom3:='redrandom3';
     
    A:='A' ;
    B:='B' ;
    C:='C' ;
     
    // Remplissage de la base de données avec les enregistrements
    Table1.Open ;
    Table1.Edit ;
    Image1:=Tbitmap.Create ;
    Image1.LoadfromFile('redrandom1.bmp');
    Table1.InsertRecord([1,redrandom1,A,Image1]);
    Image1.FreeImage ;
     
    Image1.LoadfromFile('redrandom2.bmp');
    Table1.InsertRecord([2,redrandom2,B,Image1]);
    Image1.FreeImage ;
     
    Image1.Free ;
     
    Table1.close ;
    end;

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 549
    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 549
    Points : 25 119
    Points
    25 119
    Par défaut
    Effectivement la méthode du TDBImage ...

    Juste pour aider yendre, tu dois mettre renseigner DataField et DataSource comme tu as l'habitude avec des champs DB (TDBEdit, ...)

    Sinon voici le code pour charger l'image

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TDBImage.LoadPicture;
    begin
      if not FPictureLoaded and (not Assigned(FDataLink.Field) or
        FDataLink.Field.IsBlob) then
        Picture.Assign(FDataLink.Field);
    end;
    C'est bel et bien un Assign du Field dans l'Image ...

    ceci doit fonctionner aussi alors et comme Picture est créé, le assign suffit ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1.Picture.Assign(TBlobField(Query1.FieldByName('IMAGE')));
    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

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 14
    Points
    14
    Par défaut Affichage d'une image à partir d'une base de donnée déjà créée
    Vraiment encore une fois, je vous remercie beaucoup pour ce soutien. C'est très sympa de votre part.
    J'avais un problème d'internet, ça y est c'est revenu.
    ShaiLeTroll, ton message de 10h 58min m'a beaucoup arrangé. Effectivement,
    Ta proposition de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Image1.Picture.Bitmap := TBitmap.Create();
    Image1.Picture.Bitmap.Assign(TBlobField(Query1.FieldByName('IMAGE')));
    marche très bien.

    Aussi merci à ALWEBER, pour le raffinement de mon code de remplissage de la base de données. Je teste ce que vous m'avez envoyé cet après-midi et je vous en dirai.
    Merci à tous.

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 549
    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 549
    Points : 25 119
    Points
    25 119
    Par défaut
    Attention aux fuites mémoires, chaque bitmap créé devrait surement être libéré ... essaye de voir si tu peux faire "Picture.Assign" au lieu de "Picture.Bitmap.Assign"
    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

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 14
    Points
    14
    Par défaut Tirage aléatoire avec repetition sans remise dans un ensemble d'entiers
    Bonjour,
    J'aimerais savoir s'il existe une fonction dans Delphi 7 qui permet de tirer aléatoirement n nombres différents parmis n nombres différents :
    exemple : 1,2,3,4
    resultat : 2, 1,4,1
    Merci d'avance.

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 549
    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 549
    Points : 25 119
    Points
    25 119
    Par défaut
    Randomize, Random, ... cela renvoi des valeurs à virgule, ... faut arrondir

    normalement, on ne change pas de sujet, et clic sur Résolu
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Manipulation d'images : intégrer une image dans une image
    Par noscollections dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/10/2014, 11h51
  2. [MySQL] Afficher une IMAGE dans une BDD via PHP
    Par lothar59 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 07/01/2011, 15h17
  3. Passer une variable dans une image via un script
    Par Lomig dans le forum Langage
    Réponses: 2
    Dernier message: 16/10/2006, 17h10
  4. récupérer une image de la base de données
    Par ijklm dans le forum Struts 1
    Réponses: 6
    Dernier message: 24/05/2006, 09h59
  5. Introduire une image dans la base de données
    Par ghassenus dans le forum Bases de données
    Réponses: 4
    Dernier message: 04/04/2006, 10h09

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