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 :

copier une variable Bitmap dans une autre


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 130
    Par défaut copier une variable Bitmap dans une autre
    J'essaye de faire une série de captures d'écran puis la transférer dans un tableau de Bitmap, de sorte à transformer ensuite la séquence en film.

    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
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
        b,c:TBitmap;
        image_nom:String;
        chaine_de_zeros:String;
        j:Integer;
    begin
       if (enregistrer=True) and (lecture=False) and (fast_play=False) then
       begin
         i:=i+1;
         b := TBitmap.Create;
         try
            ScreenShot(TRUE, b) ;
            Form1.Image1.Picture.Bitmap.Assign(b);
            if  i<1000 then liste_images[i].Assign(b);
         finally
           b.FreeImage;
           FreeAndNil(b) ;
         end;
       end;
    end;
    A l'exécution, j'ai une erreur de type "access violation at adress...''. En enlevant la ligne " if i<1000 then liste_images[i].Assign(b);", ça ne produit pas d'erreur, mais ça n'enregistre pas non plus le défilement d'images.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    Il te manque un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste_images[i] := TBitmap.Create;

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 130
    Par défaut
    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
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
        b,c:TBitmap;
        image_nom:String;
        chaine_de_zeros:String;
        j:Integer;
    begin
       if (enregistrer=True) and (lecture=False) and (fast_play=False) then
       begin
         i:=i+1;
         b := TBitmap.Create;
         try
            ScreenShot(TRUE, b) ;
            Form1.Image1.Picture.Bitmap.Assign(b);
            if  i<1000 then 
                begin  
                   liste_images[i] := TBitmap.Create; liste_images[i]:=b  Form1.Edit3.Text:=IntToStr(i); end;
     
         finally
           b.FreeImage;
           FreeAndNil(b) ;
         end;
       end;
    end;
     
     
    procedure TForm1.Timer3Timer(Sender: TObject);
    begin
      if (fast_play=True) and (enregistrer=False) and (lecture=False) then
      begin
        i:=i+1;
        Form1.Image1.Picture.Bitmap.Assign(liste_images[i]);
        Form1.Edit3.Text:=IntToStr(i);
      end;
    end;
    Merci pour la réponse rapide, même si ça ne marche toujours pas. J'ai mis ici 2 fonctions clef : TForm1.Timer1Time sert à enregistrer les images, TForm1.Timer3Timer sert à lire la suite d'images. Lorsque je lance Timer1, je vois les images s'afficher en "vidéo" dans la TImage1. Lorsque je lance Timer3, il ne se passe rien.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    Tu as remplacé liste_images[i].Assign(b) par liste_images[i] := b. Suivi d'un FreeAndNil(b), forcement qu'il n'y a plus rien dans liste_images[i]

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 130
    Par défaut
    Un grand merci à toi! Ca a l'air de marcher maintenant!
    Je dois avouer que j'ai pris une partie du code sur quelqu'un d'autre (le programme original servait à visualiser une capture d'écran dans une TImage) pour essayer le transformer en logiciel à filmer ce qu'il se passe sur l'écran.
    Du coup, il y a des pans de codes que je ne comprends pas (ou pas beaucoup).

    Si j'ai bien compris, le FreeAndNil(b) supprimait aussi le tableau de bitmap car c'était enregistré sous forme de pointeurs et pas d'images?

    Après quelques tests, je vois cependant qu'un autre problème apparaît (et c'était prévisible), en 20 à 30 secondes, memory overload!
    Dans un test précédent, j'enregistrais les Images sur le disque dur, mais du coup, ça ramait et donc la vidéo produite saccadait. C'est pour ça que je voulais tester sur la RAM. C'est fluide, mais pas plus de 20 secondes de film. Ou alors faudrait une résolution VGA

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    := fait que les 2 variables pointent sur la même adresse mémoire alors qu'Assign copie les données d'une instance dans une autre. Faudrait maintenant voir comment tu as résolu le problème parce que si tu as gardé :=, TBitmap.Create ne sert à rien à part consommer de la mémoire qui ne sera pas restituée.

    Cherche aussi sur le forum. Il y a des procédures pour générer directement un avi sans stocker une grande quantité de bitmaps.
    Il faudrait aussi peut-être ne faire une prise d'écran que sous certaines circonstances (Evénements souris, création de fenêtre, repeinture, etc.) et ne sauver que la zone qui a été modifiée (ClipRect). Avoir N fois la même image n'est pas utile

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/06/2011, 11h30
  2. Réponses: 9
    Dernier message: 23/06/2009, 10h54
  3. Réponses: 1
    Dernier message: 20/04/2007, 09h12
  4. [PHP-JS] mettre une variable javascript dans une variable php
    Par Mounr dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/04/2007, 09h09
  5. récupérer une variable javascript dans une variable java
    Par tx dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/07/2006, 17h55

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