Image dans fonction static

Résolu
Stroumi Messages postés 7 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 30 mars 2009 - 16 févr. 2009 à 10:16
Stroumi Messages postés 7 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 30 mars 2009 - 19 févr. 2009 à 11:34
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

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
16 févr. 2009 à 11:01
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()) ;
3
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
16 févr. 2009 à 11:49
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
---------------------
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
17 févr. 2009 à 09:26
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( );
        }
    }
}
3
Stroumi Messages postés 7 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 30 mars 2009
16 févr. 2009 à 11:12
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'
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
16 févr. 2009 à 11:59
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
0
Stroumi Messages postés 7 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 30 mars 2009
16 févr. 2009 à 12:16
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..
0
Stroumi Messages postés 7 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 30 mars 2009
16 févr. 2009 à 12:20
Désolé pour les gros caracteres, c'etait pas voulu...
0
Stroumi Messages postés 7 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 30 mars 2009
19 févr. 2009 à 11:34
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.
0
Rejoignez-nous