IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Affichage d'une image dans plusieurs fenêtres


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 60
    Points : 78
    Points
    78
    Par défaut Affichage d'une image dans plusieurs fenêtres
    Bonjour à tous,

    Je débute dans le développement C# et je fais une application utilisant une caméra.
    Pour commencer, j'ai récupéré l'image de cette caméra pour l'afficher dans un PictureBox. Tout ceci est fait avec un thread qui récupère le tableau de pixels représentant l'image. Ce tableau de pixels est stocké dans une variable. J'affiche ensuite l'image dans le PictureBox.
    --> Tout ceci est OK mais j'ai lu qu'il fallait passer par un delegate pour mettre à jour un contrôle à partir d'un thread. J'ai essayé mais j'ai une erreur alors je fais simplement dans mon thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myPictureBox.Image = (Image)bmp; // bmp est le Bitmap récupéré par l'API de la caméra
    J'ai un bon résultat avec ça.

    Mon plus gros souci, c'est que je veux créer une deuxième fenêtre qui affiche elle aussi l'image de la caméra.

    Pour cela j'ai créé un thread qui crée un bitmap avec le tableau de pixels qui a été mis à jour dans le thread de la première fenêtre. J'affiche ensuite l'image dans un PictureBox. Cette fenêtre est créée à partir de la première, je l'affiche en modal puis je la désalloue.
    A l'éxécution, lors du frm.ShowDialog(), j'ai une erreur AccessViolation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
    Lorsque j'enlève l'affichage de l'image ds la 2ème fenêtre (avec un delegate ou sans) je n'ai pas l'erreur. C'est lorsque j'utilise ma PictureBox que ça semble poser problème.

    Je ne sais pas comment résoudre ce problème, j'ai essayé lock mais je ne comprends pas trop le fonctionnement...

    Pour résumer, j'aimerais afficher un tableau de pixels dans une PictureBox sur 2 fenêtres différentes.

    Merci pour votre aide et désolé si ce message n'est pas très clair...

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 60
    Points : 78
    Points
    78
    Par défaut
    En voyant que certains ne s'embêtent pas pour créer 3 threads pour poser la même question en utilisant une seule phrase pour décrire son problème, je me permets de me répondre à moi-même pour remonter mon sujet en tête du forum...

    J'ajoute également que j'utilise des délégués pour afficher mon Bitmap dans mon contrôle PictureBox.
    Dans ma fenetre principale, ça fonctionne très bien alors que dans ma deuxième fenêtre j'ai l'erreur
    AccessViolation Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
    ou quelques fois suivant les tests que je fais
    InvalidOperationException Région bitmap déjà verrouillée.

    Merci de m'apporter une aide...

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Tout ceci est fait avec un thread qui récupère le tableau de pixels représentant l'image. Ce tableau de pixels est stocké dans une variable. J'affiche ensuite l'image dans le PictureBox.
    Le thread secondaire ne peut pas directement modifier un Control.
    C'est au thread principal de le faire à partir du tableau. Pour cela on peut passer via un "invoke" venant du thread secondaire,
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    et pour ton soucis de "mémoire utilisée" c'est surement un problème de copie de ton objet.

    J'explique...

    tu récupères ton image sous forme de tableau de pixel et si tu crées une image à partir de cela, il y a des chances que ton tableau soit "associé" à l'image.... et donc, plus disponible.

    Dans ce genre de manipulation, il serait plus logique d'avoir une classe qui fournit copie de l'image à qui la veut.

    Genre une fonction dans une classe Camera (qui pourrait être statique si multi-utilisation) du style : Camera.GetImage() et qui retournerait
    une copie de l'image construit avec les données fournis par ta caméra.
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 60
    Points : 78
    Points
    78
    Par défaut
    Merci pour vos réponses.
    J'utilise effectivement Invoke pour afficher l'image sur ma pictureBox.

    J'ai créé une classe statique qui récupère le Bitmap de la caméra ou le tableau de pixels. Je l'affiche ensuite dans mes 2 fenêtres.

    Maintenant, je voudrais afficher un rectangle dans ma 2ème fenêtre, qui soit redimensionnable et déplaçable.
    Ensuite, je voudrais récupérer les coordonnées du rectangle.

    Tout ceci est facile à faire mais :
    - ma pictureBox est d'environ 500*500
    - mon bitmap est de 2000*2000
    - j'affiche le bitmap avec un StretchMode

    Du coup lorsque je récupère les coordonnées du rectangle, je récupère les coordonnées par rapport à la pictureBox et non pas par rapport au bitmap comme je l'aurais souhaité...

    Comment pourrais-je résoudre mon problème ?

    Merci déjà pour les solutions apportées.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb d'affichage d'une image dans une fenêtre IE7
    Par NastyBoy dans le forum VBScript
    Réponses: 1
    Dernier message: 16/05/2007, 14h52
  2. Exemple affichage d'une image dans un bouton
    Par had182 dans le forum MFC
    Réponses: 2
    Dernier message: 12/01/2006, 18h38
  3. [PHP-JS] Affichage d'une image dans une popup à la taille
    Par urbanspike dans le forum Langage
    Réponses: 3
    Dernier message: 27/09/2005, 20h53
  4. Réponses: 1
    Dernier message: 11/05/2005, 17h28
  5. [DEBUTANT][HTML] affichage d'une image dans une page
    Par nimport nawak dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 12/04/2005, 19h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo