Image dans fonction static [Résolu]

Stroumi 7 Messages postés mardi 15 mai 2007Date d'inscription 30 mars 2009 Dernière intervention - 16 févr. 2009 à 10:16 - Dernière réponse : Stroumi 7 Messages postés mardi 15 mai 2007Date d'inscription 30 mars 2009 Dernière intervention
- 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
Afficher la suite 

8 réponses

Répondre au sujet
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 16 févr. 2009 à 11:01
+3
Utile
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()) ;
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de krimog
billou_13 874 Messages postés jeudi 4 mars 2004Date d'inscription 19 août 2014 Dernière intervention - 16 févr. 2009 à 11:49
+3
Utile
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
---------------------
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de billou_13
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 17 févr. 2009 à 09:26
+3
Utile
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( );
        }
    }
}
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Lutinore
Stroumi 7 Messages postés mardi 15 mai 2007Date d'inscription 30 mars 2009 Dernière intervention - 16 févr. 2009 à 11:12
0
Utile
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'
Commenter la réponse de Stroumi
ed73 276 Messages postés lundi 8 septembre 2008Date d'inscription 15 avril 2013 Dernière intervention - 16 févr. 2009 à 11:59
0
Utile
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
Commenter la réponse de ed73
Stroumi 7 Messages postés mardi 15 mai 2007Date d'inscription 30 mars 2009 Dernière intervention - 16 févr. 2009 à 12:16
0
Utile
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..
Commenter la réponse de Stroumi
Stroumi 7 Messages postés mardi 15 mai 2007Date d'inscription 30 mars 2009 Dernière intervention - 16 févr. 2009 à 12:20
0
Utile
Désolé pour les gros caracteres, c'etait pas voulu...
Commenter la réponse de Stroumi
Stroumi 7 Messages postés mardi 15 mai 2007Date d'inscription 30 mars 2009 Dernière intervention - 19 févr. 2009 à 11:34
0
Utile
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.
Commenter la réponse de Stroumi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.