Image dans fonction static

Résolu
Signaler
Messages postés
7
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
30 mars 2009
-
Messages postés
7
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
30 mars 2009
-
Bonjour tout le monde, j'aurai besoin de votre aide si possible...
Voila, je m'explique. Pour mon projet, je dois controler et recupérer une les images d'une camera. Pour cela, j'utilise la SDK fournie. La fonction qui récupère l'image est une fonction static et elle enregristre l'image sur le disque dur.
Ce que je voudrai faire, c'est modifier le code afin de directement récupérer cette image et la mettre sur ma pictureBox.
Dis comme ca, c'est pas super compliqué (enfin, je pense pas que ca l'est de tte facon), je m'embrouille avec cette fonction static, car je peux pas appeler ma picturebox a l'intérieur... Enfin, je vous montre les parties du code les plus importantes:

* On commence par définir notre callback :
* Il est appel‚ par le SDK … chaque fois qu'une nouvelle image est disponible.
* Ce callback est pour une image 8 bits (WM_IMAGE_READY)
*/

delegate
void
CS_Callback_8(
byte* data,
UInt32 data_size,
UInt32 index,
Int32 handle);
[

DllImport(
"VigiscanSDK.Dll")]

static
extern
int VC_registerCallback(
int evnt,
CS_Callback_8 func);

/**
* Le callback 8 bits.
* Cette m‚thode se contente de récupérer les données et de les enregistrer
* dans un fichier image.
*/

static
void image_callback(
byte *data,
UInt32 size,
UInt32 index,
Int32 handle)
{

VID vid;

string filename =
"image_" + index.ToString() +
".bmp";

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

if(0 == err) {

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

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

for (
int 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);
}
}

/* écriture de l'image */
img.Save(filename);

Console.WriteLine(filename +
" written");
}
}

static

void Main(
string[] args)
{
....
....
CS_Callback_8

callback =
new
CS_Callback_8(image_callback);
hnd = VC_registerCallback(WM_IMAGE_READY, callback);
...

Ca, c'est ce qu'il y a sur le SDK. moi, j'ai crée ma petite application en C# avec mes picturebox et le reste. J'arrive a appeler les fonction, mais je voudrai qu'au lieu d'enregistrer l'image, elle aille directement sur une pictureBox chaque fois que l'image est prete.

Merci

8 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
49
Salut.

Le plus simple est encore de mettre en attribut une référence à ta PictureBox, et de remplacer img.Save() par l'insertion de ton image dans la picturebox :

class



MaClasse








{
    private



PictureBox






maPictureBox; // Que tu initialises via le constructeur ou une propriété par exemple
   
   



static



void

image_callback(


byte

*data,


UInt32

size,


UInt32

index,


Int32

handle)





    {
        //[...]

        //img.Save(filename);








        //Console


.WriteLine(filename +

" written"


);





        maPictureBox.image = img;
       




Console





.WriteLine("Image ajoutée à la PictureBox.");




    }
}






Krimog :
while (!succeed = try()) ;
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
28
Bonjour,

Et pourquoi ta fonction "image_callback(...)"
ne renverrait pas une image:
static
Bitmap

image_callback(
byte *data,
UInt32 size,
UInt32 index,
Int32 handle)
{
   //...
   return
img;

}

Ainsi dans ta Form, il te suffira de faire:
maPictureBox.image = image_callback(...);

Bonne journée,

Billou_13
Bask En Force

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Salut, utilise une méthode membre au lieu d'une fonction statique :

public delegate void TimeCallback( DateTime time );



public class MainForm : Form
{
    private TimeCallback Callback = null;



    private void MainForm_Callback( DateTime time )
    {
        this.Text = time.ToLongTimeString( );
    }



    [ STAThread ]
    private static void Main( )
    {
        MainForm mainForm = new MainForm( );
        mainForm.Callback = new TimeCallback(
mainForm.MainForm_Callback
);
        mainForm.Show( );



        DateTime time = DateTime.Now;
        TimeSpan second = TimeSpan.FromSeconds( 1 );
        while( mainForm.Created )
        {
            if ( ( DateTime.Now - time ) > second )
            {
                time = DateTime.Now;
                mainForm.Callback( time );
            }



            Application.DoEvents( );
        }
    }
}
Messages postés
7
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
30 mars 2009

Oui, j'y ai pensé biensur. Mais je peux pas appelé les attributs de ma classe dans la fonction static.

Erreur 1 Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'SeaOwl.Form1.temp'
Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
A mon avis image_callback ne peut pas renvoyer une image car son prototypage est défini par le SDK. Quand bien même elle en renverrait une, il ne serait pas possible de la récupérer.

Il me semble que la solution pourrait être d'avoir une référence à ta picturebox dans une classe statique, initialisée par le constructeur de la picturebox, et d'utiliser cette référence dans image_callback
Messages postés
7
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
30 mars 2009

J'ai un soucis avc la caméra, du coup, je peux pas encore la faire marcher, enfin, cet apres midi je pourrai, du coup je pourrai tester vos solutions.
J'ai reussi à appeler mon attribut (picturebox ou Bitmap) dans ma fonction callback, tout simplement en les déclarant en static aussi. Du coup, je vais tenter ca.

Sinon, je peux modifier la fonction callback afin qu'elle retourne le Bitmap. Mais le soucis avec ca, c'est que je sais pas ou appeler :
maPictureBox.image = image_callback(...);

Car "Image_callback" est un évenement, du coup, je dois faire quoi ? créer un autre événement C# qui me dis quand la fonction "Image_callback" est terminé... un évenement pour un autre évenement..
Messages postés
7
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
30 mars 2009

Désolé pour les gros caracteres, c'etait pas voulu...
Messages postés
7
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
30 mars 2009

Salut,
deja, je vous remercie tous pour vos conseils, j'ai trouvé plusieurs
solution mais la plus propre etait de créer un nouvel event et modifier la
fonction afin qu'elle revoie le Bitmap...

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.