Bonjour,

Je suis en train de m’énerver tout seul devant mon PC donc j'ai décidé de faire appel à vous pour la santé de mes nerfs.
J'ai peu/pas de réflexes en C# je suis plutôt développeur C/C++ dans le secteur embarqué mais j'ai voulu m'essayer à Windows/.NET/C# pour pas mourir idiot ...........

Bref dans ce code j'essaye de préparer mon environnement de travail pour du traitement d'image ultérieurement. Je cherche à disposer de 3 choses :
- une visu de l'image d'origine : C'est OK j'ai une PictureBox avec mon image.
- un buffer de travail (traitement) : avec juste les pixels et là j'ai besoin de vous
- une visu de l'image après traitement : Je pense baser cette visu sur une seconde PictureBox. J'ai là aussi besoin de vous pour comprendre comment ré-injecter mon buffer de pixel dans ce contrôle.

Voici mon code (qui ne me donne pas satisfaction). Dans le buffer de sortie je n'ai rien (une surface de la même couleur que le fond de la fenêtre) !

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 
        // Mon objectif ici est d'avoir une Form avec 2 PicturesBox. La premiere affiche l'image de départ (sans traitement).
        // La seconde doit me permettre de visualiser les effets de mon traitement. Entre les deux je souhaite disposer des pixels 
        // dans un tableau en mémoire pour effectuer des operations "matricielle" dessus. 
 
        // ImgSrc est une PictureBox. Dans la fenetre Watch de Visual je peut lire que le pixelFormat est Format24bppRgb
        // ImgTgt est une PictureBox. Dans la fenetre Watch de Visual je peut lire que le pixelFormat est Format24bppRgb
 
        private void button2_Click(object sender, EventArgs e)
        {
            int i;
 
 
            /* Calcul, creation et initialisation des variables propres à l'image source */
            PixelCountSrc = ImgSrc.Width * ImgSrc.Height;
            BmpSrc = new Bitmap(ImgSrc.Image);
     // A cet endroit je peut lire que le pixelFormat de BmpSrc est Format32bppArgb. 
     // Q1 - Savez-vous pourquoi c'est pas le meme que celui de l'image passé en parametre au constructeur ?
 
            DepthSrc = ImgSrc.Image.PixelFormat;
            FullImage = new Rectangle(0, 0, BmpSrc.Width, BmpSrc.Height);
           //  bitmapDataSrc = BmpSrc.LockBits(FullImage, ImageLockMode.ReadWrite, BmpSrc.PixelFormat);
            bitmapDataSrc = BmpSrc.LockBits(FullImage, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
     // Ici le LockBits se fait sur une instance qui comporte deja une propriété PixelFormat donc le respecifier ici n'a de sens que pour "Forcer" un format de sortie.
     // Q2 - Ai-je bon ? si non, pourriez-vous m'eclairer ?
 
 
            /* Calcul, creation et initialisation des variables propres à l'image de sortie */
            BmpTgt = new Bitmap(ImgDst.Image);
     // A cet endroit je peut lire que le pixelFormat de BmpTgt est Format32bppArgb. 
     // Mais je prendrai la réponse à Q1 ici aussi.
            bitmapDataTgt = BmpTgt.LockBits(FullImage, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
     // blablabla, je prendrai ici aussi la réponse à Q2
 
            /* Calcul, creation et initialisation des variables propres au buffer de travail */
            BmpPixels = new byte[PixelCountSrc * 3];
     // Bon ici j'ai mis 3 car j'ai demandé Format24bppRgb au dessus. Mais j'adapterai en fonction des réponses précedentes
            Marshal.Copy(bitmapDataSrc.Scan0, BmpPixels, 0, BmpPixels.Length);
 
            /* Traitement bidon */
            for (i = 0; i < BmpPixels.Length; i += 3)
            {
                BmpPixels[i] = (byte)(0xFF);    // Red
                BmpPixels[i + 1] = (byte)0xFF;  // Green
                BmpPixels[i + 2] = (byte)0xFF;  // Blue
            }
 
            // Vu que la PictureBox est en 24Bpp et le bitmap en 32Bpp je suppose que la ligne suivante est incorrecte
            Marshal.Copy(BmpPixels, 0, bitmapDataTgt.Scan0, BmpPixels.Length);
 
            // Je n'es suis pas encore là (bien malheureusement ....)
            if (ImgDst.Image != null) 
                ImgDst.Dispose();
            ImgDst.Image = BmpTgt;
            ImgDst.Refresh();
        }
    }
Merci à tous ceux qui pourront m'aider et aussi a ceux qui essayeront.

Cordialement,
Sylvain