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

Framework .NET Discussion :

Équivalent InteropBitmap dans System.Drawing


Sujet :

Framework .NET

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Points : 407
    Points
    407
    Par défaut Équivalent InteropBitmap dans System.Drawing
    Bonjour à tous,

    Savez-vous s'il existe un équivalent de InteropBitmap dans System.Drawing ?

    J'ai le code suivant :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    private void capGrabber_NewFrameArrived(object sender, EventArgs e)
            {
                //this.BitmapSource.Invalidate();
            }
     
            //InteropBitmap BitmapSource { get; set; }
     
            private void capGrabber_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
            {
                try
                {
                    if ((_capGrabber.Width != default(int)) && (_capGrabber.Height != default(int)))
                    {
                        uint pcount = (uint)(_capGrabber.Width * _capGrabber.Height * PixelFormats.Bgr32.BitsPerPixel / 8);
                        _section = CreateFileMapping(new IntPtr(-1), IntPtr.Zero, 0x04, 0, pcount, null);
                        _map = MapViewOfFile(_section, 0xF001F, 0, 0, pcount);
     
     
                        //this.BitmapSource = Imaging.CreateBitmapSourceFromMemorySection(_section, _capGrabber.Width,
                            _capGrabber.Height, PixelFormats.Bgr32, _capGrabber.Width * PixelFormats.Bgr32.BitsPerPixel / 8, 0) as InteropBitmap;
                        _capGrabber.Map = _map;
     
     
                        if (NewBitmapReady != null)
                            NewBitmapReady(this, null);
                    }
                }
                catch { }
            }

    Je souhaite que cela tourne sur une application console mais je ne peux pas utiliser Invalidate() sur l'InteropBitmap (le thread appelant ne peut pas y accéder...). Je souhaite seulement faire des sauvegardes de l'image sur disque toutes les X secondes. Je souhaite de plus enlever les dépendances à WPF (WindowsBase.dll...)

    Merci d'avance.
    Cordialement,
    NeoKript

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Si l'idée est de créer une image à partir d'un emplacement mémoire, tu peux utiliser ce constructeur de Bitmap :
    http://msdn.microsoft.com/fr-fr/library/zy1a2d14.aspx

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Points : 407
    Points
    407
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Si l'idée est de créer une image à partir d'un emplacement mémoire, tu peux utiliser ce constructeur de Bitmap :
    http://msdn.microsoft.com/fr-fr/library/zy1a2d14.aspx
    Salut,

    j'ai utilisé ce que tu m'a dis :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Bitmap Bmp = new Bitmap(_capGrabber.Width, _capGrabber.Height, _capGrabber.Width * PixelFormats.Bgr32.BitsPerPixel / 8, System.Drawing.Imaging.PixelFormat.Format32bppRgb, _section);
                        Bmp.Save(@"C:\" + Guid.NewGuid().ToString() + ".jpg", ImageFormat.Jpeg);
                        Bmp.Dispose();

    L'instantiation du bitmap fonctionne mais lorsque j'utilise Save j'ai l'exception suivante :

    Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
    Une idée ?

    Merci

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Y a un truc pas cohérent dans ton code : pour calculer le stride, tu utilises Bgr32, mais ensuite tu indiques Format32bppRgb... A priori ça devrait pas changer grand chose, mais quand même, juste pour être sûr, essaie de mettre 4 * Width pour stride.

    J'ai fait un test similaire chez moi, et ça marche bien.

    C'est quoi ton _capGrabber au fait ?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Points : 407
    Points
    407
    Par défaut
    Ça ne change rien en effet.

    Le _capgraber, sert à me notifier lorsqu'une nouvelle image (de webcam) est disponible.

    J'essaye de modifier le code de : WPFCap

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Bah là je sais pas, ça me parle pas trop...

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Points : 407
    Points
    407
    Par défaut
    Je pense que le soucis vient du fait que les IntPtr passés aux constructeurs InteropBitmap et Bitmap ne représentent pas la même chose :

    scan0
    Type : System.IntPtr
    Pointeur vers un tableau d'octets qui contient les données de pixels.

    et

    section
    Type : System.IntPtr
    Pointeur vers une section de mémoire.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Possible, mais vu les signatures des méthodes, ça a quand même bien l'air d'être la même chose...

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/10/2011, 23h11
  2. System.Drawing dans un service
    Par Arnaud_B dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 29/10/2009, 18h46
  3. Réponses: 3
    Dernier message: 09/07/2009, 10h13
  4. [c#] un erreur dans le system.drawing...
    Par pointer dans le forum DirectX
    Réponses: 3
    Dernier message: 13/07/2005, 20h17
  5. [C#] Conversion System.String en System.Drawing.Color
    Par Silex dans le forum Windows Forms
    Réponses: 6
    Dernier message: 27/04/2005, 08h21

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