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 :

Re-déclaration de array of TBitmap avec SetLength


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Re-déclaration de array of TBitmap avec SetLength
    Bonjour à tous

    Celà fait 2 jours que j'ai des plantages de toutes sortes, ca va du blocage complet à memoire insuffisante et relance de D6 pour deblocage.

    Je traite des images en temps réel (webcam) dont la quantité (1 à 10) peut varier d'ou l'utilisation de Setlength pour ajuster le nombre de BMP du tableau TabBmpAdd.
    A la 1ere déclation c'est OK.

    Mais dès le redimentionement (utilisation de setlength) c'est a chaque fois 2 messages d'erreur different, (à l'execution de la ligne SetLength) avec , F9 et le soft reprend s'il ne se bloque pas.

    voici le principe du code utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var
      TabBmpAdd : array of  Tbitmap ;
     
      ........
     
      SetLength(TabBmpAdd,Nombre_image+1);
      for i:=1 to Nombre_image do
       begin
          TabBmpAdd[i]:= tbitmap.Create;
          TabBmpAdd[i].height      := TailleMire;
          TabBmpAdd[i].width       := TailleMire;
          TabBmpAdd[i].PixelFormat := Pf24bit;
       end ;
    Le but est d'analyser une partie de chaque image (de dimention TailleMire) par scanline qui fonctionne bien.

    Y a-t-il une maniere plus appropriée pour gerer des BMP ?

    Merci pour votre aide.

    Pierre de Nice
    Images attachées Images attachées   

  2. #2
    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
    Je pense qu'il faudrait supprimer les images avant de redimensionner ton tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
      For i := 0 to Length(TabBmpAdd) -1 do
        TabBmpAdd[i].free;
     
      SetLength(TabBmpAdd,Nombre_image+1);
      for i:=1 to Nombre_image do
       begin
          TabBmpAdd[i]:= tbitmap.Create;
          TabBmpAdd[i].height      := TailleMire;
          TabBmpAdd[i].width       := TailleMire;
          TabBmpAdd[i].PixelFormat := Pf24bit;
       end ;
    Modérateur Delphi

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

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Yep !

    J'ai l'impression que tu fais un SetLength mais que tu ne connais pas la taille nécessaire pour l'allocation mémoire, ou alors tu ne nous as pas montré comment tu calcules cette taille.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Pour moi la taille du tableau ARRAY of Tbitmap est le nombre d'image ?

    merci pour votre aide ...
    voici le code qui fonctionne mieux mais pas très stable (genre memoire insuffisante si je touche le code pendant l"execution, mettre un point d'arret) !

    Toute fois je ne comprends pas trop pourquoi il faut liberer les birmap pour pouvoir redimentionner le tableau.

    Le code provisoire qui tourne :
    CBoxBmp est un CheckBox
    BmpAdd est un bmp qui me sert part la suite à copier une zone d'une image
    A noter que dans ce cas il n'y a pas besoin de liberer par un BmpAdd.free, le
    simple BmpAdd:=Tbitmap.Create; suffirait à redimentionner le Bitmap .

    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 TMain.CBoxBmpClick(Sender: TObject);
      Var i : byte;
      NombreImage: byte;
      begin
     if CBoxBmp.Checked then
     begin
      NombreImage:=Listbox2.ItemIndex+1;
      form3.MEMO1.Lines.Append('CBoxBmp=true affectation des BMP');
      BmpAdd:=Tbitmap.Create;
      BmpAdd.PixelFormat:=Pf24bit;
      BmpAdd.Height:=TailleMire;
      BmpAdd.Width:=TailleMire;
     SetLength(TabBmpAdd,NombreImage+1);
     for i:=0 to NombreImage do
       begin
          TabBmpAdd[i]:= tbitmap.Create;
          TabBmpAdd[i].height      := TailleMire;
          TabBmpAdd[i].width       := TailleMire;
          TabBmpAdd[i].PixelFormat := Pf24bit;
       end ;
     // bmpADD.Canvas.CopyRect(fonctions_pierre.,Bmp.Canvas,rect(debutX,debutY,FinX,FinY))
     end
     else
      begin
      if assigned(Tabbmpadd)then
       For i := 0 to Length(TabBmpAdd)-1 do
        TabBmpAdd[i].free;
       form3.MEMO1.Lines.Append( 'cbox=false suppression des BMP');
      end;
    end;
    Il y a certainement des moyens plus appropriés pour travailler avec des BMP mais j'ai pas du tout la culture, a suivre .....

    Cordialement

    Pierre de Nice

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    voici le code qui fonctionne mieux mais pas très stable (genre memoire insuffisante ...) !

    Toute fois je ne comprends pas trop pourquoi il faut liberer les birmap pour pouvoir redimentionner le tableau.
    ... ben justement : pour éviter de saturer la mémoire car "anciens bitmap's + nouveaux bitmap's" peut dépasser la mem-vive-disponible.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Je traite des images en temps réel (webcam) dont la quantité (1 à 10) peut varier d'ou l'utilisation de Setlength pour ajuster le nombre de BMP du tableau TabBmpAdd.
    Comment ce passe le temps réel ? L'appli est multi-threadée ? C'est un événement qui se déclenche pour dire que les photos sont dispos ?

    Dans ce cas, il ce pourrait que le traitement des images soit aléatoirement interrompu pour traiter les nouvelles images qui arrivent... Si ca peut se produire, c'est à coup sur la cause de tout tes problèmes.

    Toute fois je ne comprends pas trop pourquoi il faut liberer les birmap pour pouvoir redimentionner le tableau.
    En soit ce n'est pas nécessaire, seulement il faut bien détruire les TBitmap qui ont été créés à un moment où à un autre. De préférence, dès qu'on a fini de s'en servir... sinon c'est le Out Of memory qui arrive tôt ou tard (en général en commençant par un très fort ralentissement car Windows swap tout sur disque, jusqu'au crash...).

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Bonjour à tous

    merci pour votre aide, il faut effectivement effacer une à une les images d'un tableau de Bitmap avant de refaire un "SetLength .

    Remarques :
    Je fais Ctrl alt sup pour avoir le gestionnaire de tache window et dans l'onglet "Processus" on voit très bien le comportement de la mémoire ... et quand ca grimpe plus c'est tout bon !

    Cordialement

    Pierre de Nice

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 17/06/2010, 18h25
  2. Array et liaison avec des images
    Par Lord Silk dans le forum ActionScript 3
    Réponses: 5
    Dernier message: 04/01/2008, 13h21
  3. [Reflect] Créer un array d'objets avec le nom de leur classe
    Par Onarap dans le forum API standards et tierces
    Réponses: 18
    Dernier message: 12/06/2006, 12h24
  4. Transfert d'un TBitMap avec Indy 10
    Par NotANumber dans le forum Langage
    Réponses: 4
    Dernier message: 24/01/2006, 20h26
  5. probleme lié à la déclaration de array
    Par eleve36 dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 09/11/2005, 17h26

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