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

Contribuez .NET Discussion :

[C#] Comment créer un AVI avec des BMP ou JPG ? [Sources]


Sujet :

Contribuez .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Par défaut [C#] Comment créer un AVI avec des BMP ou JPG ?
    bonjour,

    je débute en C#.NET et je n'arrive pas a trouver comment creer un AVI a partir d'images JPG ou BMP. j'ai bien trouvé des info sur AVIFileCreateStream mais c'est pour du C/C++ avec la lib vfw32.lib (lien msdn). Je pensais que DirectShow permettait ce genre de chose mais impossible de retrouver l'info...

    Merci par avance,
    cordialement,
    Sylvain.

  2. #2
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    A ma connaissance, tu n'as pas d'autres choix dans ce cas de figure que d'utiliser justement le P/Invoke. Tu as un exemple ici > Writing an AVIfile with C#

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Par défaut
    Bonjour,

    j'avais effectivement trouvé ces sources via Google mais je ne m'y étais pas arreté car il fallait compiler en /unsafe. Ne trouvant rien d'autre, j'ai essayé et ca fonctionne. Seul regret, il n'y a que la methode/fonction bmp.SetPixel(x,y,color) pour composer l'image, donc j'ai fait une boucle (2 for imbriqués pour etre exact) qui recopie les pixels un à un... n'y aurait il pas une maniere de proceder pour recopier moins "lourdement" le Bitmap ? car cela fait chutter le "frame rate" à cause de la charge processeur...

    En tout cas, merci quand même !

  4. #4
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par sremy
    Bonjour,

    j'avais effectivement trouvé ces sources via Google mais je ne m'y étais pas arreté car il fallait compiler en /unsafe. Ne trouvant rien d'autre, j'ai essayé et ca fonctionne. Seul regret, il n'y a que la methode/fonction bmp.SetPixel(x,y,color) pour composer l'image, donc j'ai fait une boucle (2 for imbriqués pour etre exact) qui recopie les pixels un à un... n'y aurait il pas une maniere de proceder pour recopier moins "lourdement" le Bitmap ? car cela fait chutter le "frame rate" à cause de la charge processeur...

    En tout cas, merci quand même !
    Arf mais là c'est autre chose en effet, moi je croyais que tu faisais ton AVI directement à partir d'un bmp ou jpg existant. si tu dois composer de toutes pièces l'image avant il te faut utiliser les fonctionnalités du framework, notamment la Classe Graphics, la Classe Image et la Classe Bitmap

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Par défaut
    Bonjour,

    Pour donner plus de detail, j'ai des Bitmap qui arrivent à la volée, mais avec ce code (AviWriter.cs) voici comment cela ce passe.
    Disons donc que l'on est dans une boucle while et que l'on a à chaque itération un Bitmap différent (Bitmap imagebmp)

    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
     
    //declarations 
    Bitmap bmp_a_mettre_dans_la_video;
    //different à chaque itération du while
    AviWriter aw = new AviWriter();
     
    Bitmap frame_de_la_video = aw.Open(@"video.avi", fps, Width, Height);
     
    for (int i = 0; i < frame_de_la_video.Width; i++)
         for (int j = 0; j < frame_de_la_video.Height; j++)
           frame_de_la_video.SetPixel(i, j,
     bmp_a_mettre_dans_la_video.GetPixel(i, j));
     
    bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
    aw.AddFrame();
    aw.Close();
    De cette maniere, on crée un AVI d'1 frame par passage dans le while, les 2 images ont les même dimensions (height,width). Avec les 2 for imbriqués, je "m'amuse" a recopier les pixels un à à un dans l'image qui va composer la frame. Il n'y a pas de "fonction" prévue pour directement passer un bmp au AviWritter. C'est en fait l'avi writer qui retourner un bmp qui sert a composer toute les frames de la video. C'est pour cela que je travail sur ce Bitmap frame_de_la_video et que j'utilise la seule fonction qui permet de le modifier : frame_de_la_video.SetPixel(x,y,Color); ...
    une idée?
    parceque, comme je le disais, cela fonctionne mais en faisant chuter le fps de l'avi à cause des 2 for imbriqués et pourtant c'est que du 320x240 = 76800 pixels à modifier.

    je ne sais pas si j'ai été clair, mais c'est assez difficile à expliquer...
    merci encore ;o)

  6. #6
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Je te propose plusieurs petites modifs qui vont j'espère (attention je n'ai pas eu le temps de tester) apporter un progrès
    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
    //declarations en dehors de la boucle while ;) 
    Bitmap bmp_a_mettre_dans_la_video;
    Bitmap frame_de_la_video;
    AviWriter aw = null;
     
    //ta procedure en boucle
    while (?)
    {
       aw = new AviWriter();
       frame_de_la_video = aw.Open(@"video.avi", fps, Width, Height);
     
       'ici le code de copie à améliorer puis
     
       bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
       aw.AddFrame();
       aw.Close();
    }
    Pour le code de copie d'un Bitmap, ne serai-il pas interressant d'utiliser l'une des surcharges de Bitmap.Clone

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/02/2011, 15h46
  2. Comment créer un utilisateurs avec des droits très limités
    Par M@XflY dans le forum Administration système
    Réponses: 2
    Dernier message: 09/12/2008, 19h37
  3. comment créer une application avec des switchs
    Par abderrahim_05 dans le forum Débuter
    Réponses: 5
    Dernier message: 28/12/2007, 19h07
  4. Réponses: 2
    Dernier message: 06/04/2007, 11h30
  5. [PHP-JS] Comment créer une boucle avec des headers
    Par djinnwatcher dans le forum Langage
    Réponses: 10
    Dernier message: 17/07/2006, 15h48

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