Probleme picturebox et Bitmap

Stroumi Messages postés 7 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 30 mars 2009 - 19 févr. 2009 à 14:34
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 20 févr. 2009 à 11:03
Bonjour,
je récupèré une image via une camera via la SDK de cette camera.
Il s'agit d'un événement, lorsque l'image est prête, elle est envoyée. (il s'agit d'une camera 360°).
Puis, je l'affiche sur ma picturebox.

Mais j'ai 2 autres soucis :
-
la mémoire ne cesse d'augmenter, j'ai beau mettre des Dispose() sur mes
Bitmap, remettre ma picturebox a null, le probleme est toujours la.
-
l'autre soucis vient du fait que l'affichage est assez lent, la camera
doit envoyer une image chaque seconde, mais le tps que ma fonction
fasse sa boucle en longeur et largeur de mon Bitmap pour le remplir, ca
prend un certain tps, du coup, j'affiche une image touts les 3
secondes. Je sais que mes images sont enorme (9600,750), mais n'y a
t'il pas un autre moyen que de faire cette boucle pour remplir ma
Bitmap ?

Voici le code :
private Bitmap
img;

static
void image_callback (
byte *data,
UInt32 size,
UInt32 index,
Int32 handle)
{
int k, i, j ;
pictureBox1.Image = null;
img = null;

VID vid;

/* récupération des dimensions de l'image */
int err = VC_getImageStatus(&vid);

if(0 == err) {

/* création de l'image */
 img =
new Bitmap(vid.m_iWidth, vid.m_iHeight);

/* remplissage */
for (k 0, j 0; j < vid.m_iHeight; ++j)
{

for (
i = 0; i < vid.m_iWidth; ++i, ++k)
{

Color col =
Color.FromArgb(data[k], data[k], data[k]);
img.SetPixel(i, vid.m_iHeight - 1 - j, col);
}
}

/* affichage de l'image
pictureBox1.Image = img;
img.Dispose();

}
}

Merci.

4 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
19 févr. 2009 à 16:34
Salut, oui 9600px c'est grand.. mais le vrai problème c'est l'utilisation de la méthode SetPixel, on ne peut pas travailler correctement sur un bitmap avec cette méthode, tu dois utiliser les pointeurs et la méthode LockBits ( y'a des km d'exemples sur le net ). Et essaye aussi de dessiner toi même l'image avec DrawImage plutôt que d'assigner une nouvelle image à la PictureBox.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
19 févr. 2009 à 16:41
Tu peux aussi utiliser >ce constructeur< de la classe Bitmap, qui est très pratique et évite de faire une copie de l'image.

Pour la mémoire qui augmente c'est soit que la PictureBox maintient une copie et ne la détruit pas tout de suite, soit le buffer non-managé ( byte* data ) qui n'est jamais détruit et dans ce cas c'est la doc du SDK qui doit te dire si t'es responsable de sa destruction ou pas.
0
Stroumi Messages postés 7 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 30 mars 2009
20 févr. 2009 à 10:33
Salut, merci deja pour votre aide.
J'ai trouvé qq solutions pour mon soucis d'image, mais voila, je me rend compte que ca fait trop longtemps que j'ai plus fait de C et utiliser les pointeur.
Du coup, je tombe tout le tps que la même erreur : Impossible de convertir de 'byte*' en 'byte[]'..
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
20 févr. 2009 à 11:03
Comme je ne connais pas ton code, je ne peux pas te dire où pourrait être ton erreur. Cependant, voici un code lockbits/unsafe qui marche (en l'occurrence il transforme l'image en niveaux de gris en faisant la moyenne des 3 composantes)

        public Bitmap AlgoNoirEtBlancBasique()
        {
            BitmapData bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
                                               ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            IntPtr scan0 = bd.Scan0;
            int offset = bd.Stride - bmp.Width * 3;
            int moyenne;

            unsafe
            {
                byte* p = (byte*)(void*)scan0;
                for (int j = 0; j < bmp.Height; j++)
                {
                    for (int i = 0; i < bmp.Width; i++)
                    {
                        moyenne = (int)(double)(p[0] + p[1] + p[2]) / 3;
                        p[0] = (byte)moyenne;
                        p[1] = (byte)moyenne;
                        p[2] = (byte)moyenne;

                        p += 3;
                    }

                    p += offset;
                }
            }

            bmp.UnlockBits(bd);

            return bmp;
        }

Krimog :
while (!succeed = try()) ;
0
Rejoignez-nous