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

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 2
    Points
    2
    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 éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    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#
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 2
    Points
    2
    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 éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    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
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 2
    Points
    2
    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 éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    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
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour tes réponses,

    Mais j'avais déjà pensé à cette technique, mais cela ne peut pas fonctionner (et ne fonctionne pas) car c'est lorsqu'on fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frame_de_la_video = aw.Open(@"video.avi", fps, Width, Height);
    que aw.Open(...) renvoie le bitmap (ici frame_de_la_video) que l'on doit modifier/remplir pour ensuite faire aw.addFrame(); qui a pour objectif d'ajouter ce fameux bitmap (à l'adresse du bitmap retourné par aw.Open(...)) au fichier *.avi

    Si on clone imagebmp pour l'enregistrer dans frame_de_la_video, cela ecrase frame_de_la_video par un autre bitmap (plus la même adresse en mémoire).

    tu comprends ce que je veux dire ? je suis en train de regarder le code de AviWritter pour voir si je peu pas le modifier pour ajouter une méthode addFrame(Bitmap addthisbitmap) à la classe AviWriter.

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par sremy
    ...tu comprends ce que je veux dire ? je suis en train de regarder le code de AviWritter pour voir si je peu pas le modifier pour ajouter une méthode addFrame(Bitmap addthisbitmap) à la classe AviWriter.
    Oui c'est effectivement le plus judicieux
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    c'est bon ! problème résolu !

    je met ici le code entier de AviWriter.cs modifié. L'original est disponible ici.

    la fonction que j'ai ajouté est :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public void LoadFrame(Bitmap nextframe)
        {
            bmp_ = new Bitmap(nextframe);
        }

    et le code complet modifié :

    Code C# : 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
     
    using System;
    using System.Runtime.InteropServices;
    using System.Drawing;
    using System.Drawing.Imaging;
     
    public class AviWriter
    {
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        private struct AVISTREAMINFOW
        {
            public UInt32 fccType;
            public UInt32 fccHandler;
            public UInt32 dwFlags;
            public UInt32 dwCaps;
            public UInt16 wPriority;
            public UInt16 wLanguage;
            public UInt32 dwScale;
            public UInt32 dwRate;
            public UInt32 dwStart;
            public UInt32 dwLength;
            public UInt32 dwInitialFrames;
            public UInt32 dwSuggestedBufferSize;
            public UInt32 dwQuality;
            public UInt32 dwSampleSize;
            public UInt32 rect_left;
            public UInt32 rect_top;
            public UInt32 rect_right;
            public UInt32 rect_bottom;
            public UInt32 dwEditCount;
            public UInt32 dwFormatChangeCount;
            public UInt16 szName0;
            public UInt16 szName1;
            public UInt16 szName2;
            public UInt16 szName3;
            public UInt16 szName4;
            public UInt16 szName5;
            public UInt16 szName6;
            public UInt16 szName7;
            public UInt16 szName8;
            public UInt16 szName9;
            public UInt16 szName10;
            public UInt16 szName11;
            public UInt16 szName12;
            public UInt16 szName13;
            public UInt16 szName14;
            public UInt16 szName15;
            public UInt16 szName16;
            public UInt16 szName17;
            public UInt16 szName18;
            public UInt16 szName19;
            public UInt16 szName20;
            public UInt16 szName21;
            public UInt16 szName22;
            public UInt16 szName23;
            public UInt16 szName24;
            public UInt16 szName25;
            public UInt16 szName26;
            public UInt16 szName27;
            public UInt16 szName28;
            public UInt16 szName29;
            public UInt16 szName30;
            public UInt16 szName31;
            public UInt16 szName32;
            public UInt16 szName33;
            public UInt16 szName34;
            public UInt16 szName35;
            public UInt16 szName36;
            public UInt16 szName37;
            public UInt16 szName38;
            public UInt16 szName39;
            public UInt16 szName40;
            public UInt16 szName41;
            public UInt16 szName42;
            public UInt16 szName43;
            public UInt16 szName44;
            public UInt16 szName45;
            public UInt16 szName46;
            public UInt16 szName47;
            public UInt16 szName48;
            public UInt16 szName49;
            public UInt16 szName50;
            public UInt16 szName51;
            public UInt16 szName52;
            public UInt16 szName53;
            public UInt16 szName54;
            public UInt16 szName55;
            public UInt16 szName56;
            public UInt16 szName57;
            public UInt16 szName58;
            public UInt16 szName59;
            public UInt16 szName60;
            public UInt16 szName61;
            public UInt16 szName62;
            public UInt16 szName63;
        }
     
        // vfw.h
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        private struct AVICOMPRESSOPTIONS
        {
            public UInt32 fccType;
            public UInt32 fccHandler;
            public UInt32 dwKeyFrameEvery;
              // only used with AVICOMRPESSF_KEYFRAMES
            public UInt32 dwQuality;
            public UInt32 dwBytesPerSecond;
              // only used with AVICOMPRESSF_DATARATE
            public UInt32 dwFlags;
            public IntPtr lpFormat;
            public UInt32 cbFormat;
            public IntPtr lpParms;
            public UInt32 cbParms;
            public UInt32 dwInterleaveEvery;
        }
     
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct BITMAPINFOHEADER
        {
            public UInt32 biSize;
            public Int32 biWidth;
            public Int32 biHeight;
            public Int16 biPlanes;
            public Int16 biBitCount;
            public UInt32 biCompression;
            public UInt32 biSizeImage;
            public Int32 biXPelsPerMeter;
            public Int32 biYPelsPerMeter;
            public UInt32 biClrUsed;
            public UInt32 biClrImportant;
        }
     
        public class AviException : ApplicationException
        {
            public AviException(string s) : base(s) { }
            public AviException(string s, Int32 hr)
                : base(s)
            {
     
                if (hr == AVIERR_BADPARAM)
                {
                    err_msg = "AVIERR_BADPARAM";
                }
                else
                {
                    err_msg = "unknown";
                }
            }
     
            public string ErrMsg()
            {
                return err_msg;
            }
            private const Int32 AVIERR_BADPARAM = -2147205018;
            private string err_msg;
        }
     
        public Bitmap Open(string fileName, UInt32 frameRate, int width, int
     height)
        {
            frameRate_ = frameRate;
            width_ = (UInt32)width;
            height_ = (UInt32)height;
            bmp_ = new Bitmap(width, height, PixelFormat.Format24bppRgb);
            BitmapData bmpDat = bmp_.LockBits(new Rectangle(0, 0, width,
     height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            stride_ = (UInt32)bmpDat.Stride;
            bmp_.UnlockBits(bmpDat);
            AVIFileInit();
            int hr = AVIFileOpenW(ref pfile_, fileName, 4097 /* OF_WRITE |
     OF_CREATE (winbase.h) */, 0);
            if (hr != 0)
            {
                throw new AviException("error for AVIFileOpenW");
            }
     
            CreateStream();
            SetOptions();
     
            return bmp_;
        }
     
        public void AddFrame()
        {
     
            BitmapData bmpDat = bmp_.LockBits(
              new Rectangle(0, 0, (int)width_, (int)height_),
     ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
     
            int hr = AVIStreamWrite(psCompressed_, count_, 1,
               bmpDat.Scan0, // pointer to data
               (Int32)(stride_ * height_),
               0, // 16 = AVIIF_KEYFRAMe
               0,
               0);
     
            if (hr != 0)
            {
                throw new AviException("AVIStreamWrite");
            }
     
            bmp_.UnlockBits(bmpDat);
     
            count_++;
        }
     
        public void LoadFrame(Bitmap nextframe)
        {
     
            bmp_ = new Bitmap(nextframe);
        }
     
        public void Close()
        {
            AVIStreamRelease(ps_);
            AVIStreamRelease(psCompressed_);
     
            AVIFileRelease(pfile_);
            AVIFileExit();
        }
     
        private void CreateStream()
        {
            AVISTREAMINFOW strhdr = new AVISTREAMINFOW();
            strhdr.fccType = fccType_;
            strhdr.fccHandler = fccHandler_;
            strhdr.dwFlags = 0;
            strhdr.dwCaps = 0;
            strhdr.wPriority = 0;
            strhdr.wLanguage = 0;
            strhdr.dwScale = 1;
            strhdr.dwRate = frameRate_; // Frames per Second
            strhdr.dwStart = 0;
            strhdr.dwLength = 0;
            strhdr.dwInitialFrames = 0;
            strhdr.dwSuggestedBufferSize = height_ * stride_;
            strhdr.dwQuality = 0xffffffff; //-1;         // Use default
            strhdr.dwSampleSize = 0;
            strhdr.rect_top = 0;
            strhdr.rect_left = 0;
            strhdr.rect_bottom = height_;
            strhdr.rect_right = width_;
            strhdr.dwEditCount = 0;
            strhdr.dwFormatChangeCount = 0;
            strhdr.szName0 = 0;
            strhdr.szName1 = 0;
     
            int hr = AVIFileCreateStream(pfile_, out ps_, ref strhdr);
     
            if (hr != 0)
            {
                throw new AviException("AVIFileCreateStream");
            }
        }
     
        unsafe private void SetOptions()
        {
            AVICOMPRESSOPTIONS opts = new AVICOMPRESSOPTIONS();
            opts.fccType = fccType_;
            opts.fccHandler = 0;//fccHandler_;
            opts.dwKeyFrameEvery = 0;
            opts.dwQuality = 0;  // 0 .. 10000
            opts.dwFlags = 0;  // AVICOMRPESSF_KEYFRAMES = 4
            opts.dwBytesPerSecond = 0;
            opts.lpFormat = new IntPtr(0);
            opts.cbFormat = 0;
            opts.lpParms = new IntPtr(0);
            opts.cbParms = 0;
            opts.dwInterleaveEvery = 0;
     
            AVICOMPRESSOPTIONS* p = &opts;
            AVICOMPRESSOPTIONS** pp = &p;
     
            IntPtr x = ps_;
            IntPtr* ptr_ps = &x;
     
            AVISaveOptions(0, 0, 1, ptr_ps, pp);
     
     
     
            // TODO: AVISaveOptionsFree(...)
     
            int hr = AVIMakeCompressedStream(out psCompressed_, ps_, ref
     opts, 0);
            if (hr != 0)
            {
                throw new AviException("AVIMakeCompressedStream");
            }
     
            BITMAPINFOHEADER bi = new BITMAPINFOHEADER();
            bi.biSize = 40;
            bi.biWidth = (Int32)width_;
            bi.biHeight = (Int32)height_;
            bi.biPlanes = 1;
            bi.biBitCount = 24;
            bi.biCompression = 0;  // 0 = BI_RGB
            bi.biSizeImage = stride_ * height_;
            bi.biXPelsPerMeter = 0;
            bi.biYPelsPerMeter = 0;
            bi.biClrUsed = 0;
            bi.biClrImportant = 0;
     
            hr = AVIStreamSetFormat(psCompressed_, 0, ref bi, 40);
            if (hr != 0)
            {
                throw new AviException("AVIStreamSetFormat", hr);
            }
        }
     
        [DllImport("avifil32.dll")]
        private static extern void AVIFileInit();
     
        [DllImport("avifil32.dll")]
        private static extern int AVIFileOpenW(ref int ptr_pfile, [MarshalAs
    (UnmanagedType.LPWStr)]string fileName, int flags, int dummy);
     
        [DllImport("avifil32.dll")]
        private static extern int AVIFileCreateStream(int ptr_pfile, out IntPtr
     ptr_ptr_avi, ref AVISTREAMINFOW ptr_streaminfo);
        [DllImport("avifil32.dll")]
        private static extern int AVIMakeCompressedStream(out IntPtr
     ppsCompressed, IntPtr aviStream, ref AVICOMPRESSOPTIONS ao, int
     dummy);
     
        [DllImport("avifil32.dll")]
        private static extern int AVIStreamSetFormat(IntPtr aviStream, Int32
     lPos, ref BITMAPINFOHEADER lpFormat, Int32 cbFormat);
     
        [DllImport("avifil32.dll")]
        unsafe private static extern int AVISaveOptions(int hwnd, UInt32 flags,
     int nStreams, IntPtr* ptr_ptr_avi, AVICOMPRESSOPTIONS** ao);
     
        [DllImport("avifil32.dll")]
        private static extern int AVIStreamWrite(IntPtr aviStream, Int32 lStart,
     Int32 lSamples, IntPtr lpBuffer, Int32 cbBuffer, Int32 dwFlags, Int32
     dummy1, Int32 dummy2);
     
        [DllImport("avifil32.dll")]
        private static extern int AVIStreamRelease(IntPtr aviStream);
     
        [DllImport("avifil32.dll")]
        private static extern int AVIFileRelease(int pfile);
     
        [DllImport("avifil32.dll")]
        private static extern void AVIFileExit();
     
        private int pfile_ = 0;
        private IntPtr ps_ = new IntPtr(0);
        private IntPtr psCompressed_ = new IntPtr(0);
        private UInt32 frameRate_ = 0;
        private int count_ = 0;
        private UInt32 width_ = 0;
        private UInt32 stride_ = 0;
        private UInt32 height_ = 0;
        private UInt32 fccType_ = 1935960438;  // vids
        private UInt32 fccHandler_ = 808810089;// IV50
        //1145656899;  // CVID
        private Bitmap bmp_;
    };

    Merci encore pour votre aide !
    et a bientôt !

    Cordialement,
    Sylvain REMY.

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    de ta contribution, je deplace d'ailleurs dans un forum dédié afin d'interresser nos rédacteurs à celle-ci
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  11. #11
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Salut,

    Je viens de lire ce sujet qui repond exactement a ce que je voudrais faire.
    Quelqu'un peut il resumer comment s'utilise le AviWriter modifie dans le cas d'une video cree a partir de bitmap generees a la volee ?

    Merci

  12. #12
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Et comment empecher windows de me faire choisir le codec a utiliser a chaque appel a aw.Writer.Open()? Merci

  13. #13
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Probleme resolu

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Image inversé
    Bonjour,

    Ca fait bien longtemps que ceci a été posté mais bon, on sait jamais.
    J'essaye de fabriquer une video avec des images, le code fournit plus haut fonctionne. Seul hic .. ma video a un effet mirroir horizontal et vertical.

    c'est du a quoi ? comment je peux résoudre ce probleme ?

    merci d'avance.

  15. #15
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Points : 67
    Points
    67
    Par défaut
    Déterrage de sujet \o/

    Citation Envoyé par samoh
    comment empecher windows de me faire choisir le codec a utiliser a chaque appel a aw.Writer.Open()
    Citation Envoyé par samoh
    Probleme resolu
    Ah bah ça on est content pour toi. Sisi, vraiment. Si tu pouvais mettre la solution au lieu de fanfaronner ça serait mieux encore.

    Citation Envoyé par Nonold
    J'essaye de fabriquer une video avec des images, le code fournit plus haut fonctionne. Seul hic .. ma video a un effet mirroir horizontal et vertical.
    On va espérer que tu as résolu tout seul ton problème... Du à quoi ? Aucune idée. Solution : la function RotateFlip d'un bmp. Par exemple tonBmp.RotateFlip(RotateFlipType.RotateNoneFlipY);

    Si quelqu'un a la solution au problème n°1, je suis preneur, sinon je cherche.

    Au passage, merci pour les petites améliorations présentées sur le topic, ça marche impec

  16. #16
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Points : 625
    Points
    625
    Par défaut
    Redétérage :

    Je ne sais pas comment le FrameWork charge les fichiers BMP,
    mais je me rappelle que les pixels sont écrits dans l'ordre inverse de l'affichage, c'est à dire en partant du dernier affiché au premier affiché, ce qui expliquerait le RotateFlip.
    "Essayer est le premier pas vers l'Echec !" (Homer Simpson)

  17. #17
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par mewa
    Citation Envoyé par samoh
    comment empecher windows de me faire choisir le codec a utiliser a chaque appel a aw.Writer.Open()
    Citation Envoyé par samoh
    Probleme resolu
    Ah bah ça on est content pour toi. Sisi, vraiment. Si tu pouvais mettre la solution au lieu de fanfaronner ça serait mieux encore.
    Un autre AviWriter ici.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                    // uncomment if video settings dialog is required to show
                    // Win32.AVISaveOptions( stream, ref options );
    Vala. Sinon pour faire un set sur le format qu'on veut, il faut utiliser les codes FOURCC.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                opts.fccType = (uint) mmioFOURCC('v','i','d','s');
                //DIB : no compression, CRAM : Microsoft vidéo
                opts.fccHandler = (uint) mmioFOURCC('D', 'I', 'B', ' ');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            private Int32 mmioFOURCC(char ch0, char ch1, char ch2, char ch3)
            {
                return ((Int32)(byte)(ch0) | ((Int32)(byte)(ch1) << 8) |
                ((Int32)(byte)(ch2) << 16) | ((Int32)(byte)(ch3) << 24));
            }

+ 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