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

  1. #1
    Membre du Club
    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
    Points : 46
    Points
    46
    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 710
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 710
    Points : 13 174
    Points
    13 174
    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 du Club
    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
    Points : 46
    Points
    46
    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 710
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 710
    Points : 13 174
    Points
    13 174
    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 du Club
    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
    Points : 46
    Points
    46
    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 710
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 710
    Points : 13 174
    Points
    13 174
    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

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    := 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.
    attention tout de même, une propriété avec un setter change la donne

    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
     
    type
      TMonObject = class
      private
        FBitmap : TBitmap;
        procedure SetBitmap(Value: TBitmap);
      public
        constructor Create;
        destructor Destroy; override;
        property Bitmap: TBitmap read FBitmap write SetBitmap;
      end;
     
    constructor TMonObject.Create;
    begin
      inherited;
      FBitmap := TBitmap.Create;
    end;
     
    destructor TMonObject.Destroy;
    begin
      FBitmap.Free;
      inherited;
    end;
     
    procedure TMonObject.SetBitmap(Value: TBitmap);
    begin
      FBitmap.Assign(Value);
    end;
     
    begin
      MonObject1.Bitmap := Bitmap1; // c'est un Assign()
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Citation Envoyé par sys1
    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
    Utilse AVIMakeCompressedStream pour choisir un bon codec vidéo disponible sur ton pc

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