Probleme picturebox et Bitmap

Signaler
Messages postés
7
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
30 mars 2009
-
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
14 février 2015
-
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

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
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.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
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.
Messages postés
7
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
30 mars 2009

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[]'..
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
14 février 2015
49
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()) ;