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 :

[C#][Bitmap] Comment copier un bitmap vers un autre ?


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 9
    Points : 10
    Points
    10
    Par défaut [C#][Bitmap] Comment copier un bitmap vers un autre ?
    Bonjour tout le monde,

    je suis en train d'implémenter un filtre source DirectShow en C++/MC++/C# et j'ai un problème avec des bitmaps.

    Voici le scénario : j'ai une classe qui périodiquement appelle une méthode qui va lire des bitmaps se trouvant sur le disque dur. Cette classe appelle cette méthode en passant un pointeur int. (Impossible de passer un pointeur Bitmap, car la classe est définie en C++ et la méthode qui est appelée est définie en C#, donc incompatibilité System.Drawing Gdiplus...)

    Ce pointeur je l'utilise pour créer un bitmap comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       System.IntPtr a = new System.IntPtr(_buf);
       Bitmap b = new Bitmap(714, 481, _stride, System.Drawing.Imaging.PixelFormat.Format32bppRgb, a);
       Graphics grphcsObj = Graphics.FromImage(b);
    où _buf et le pointeur int que je passe à la méthode implémenté en C#.

    Pour charger le bitmap du disque dur je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       Bitmap bc = new Bitmap("I:\frame_000000.bmp");
    Après ce que j'aimerais faire c'est copier le contenu de l'image que je viens de charger du disque dur dans l'image que j'ai créé en utilisant le pointeur int.

    Je fais comme suis, mais ça ne m'affiche rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       Graphics grphcsObj = Graphics.FromImage(b);
       grphcsObj.ScaleTransform(1.0f, -1.0f);
       grphcsObj.TranslateTransform(0, bc.Height, System.Drawing.Drawing2D.MatrixOrder.Append);
     
       grphcsObj.DrawImage(bc, 0, 0, 714, 481);
    Evidemment, puisqu'il s'agit d'une méthode qui est appelée très souvent j'utilise dispose pour chaque élément alloué, mais là une exception est levée :
    "An unhandled exception of type 'System.InvalidOperationException' occurred in system.drawing.dll
    Additional information: L'objet est actuellement utilisé ailleurs."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      bc.Dispose();
      grphcsObj.Dispose();
      b.Dispose();
    Est-ce que quelqu'un peut me dire quelle est la niaiserie que je suis en train de commettre? Ou la meilleure façon de faire pour copier le contenu d'un bitmap (ou image quelconque : jpeg, png....) dans un bitmap crée à l'aide d'un System.IntPr?

    Merci beaucoup d'avance pour tout aide fournie et bonne fin d'année à tous/toutes,

    JC

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Si j'ai bien compris, l'objectif est de récupérer les données d'un System.Drawing.Bitmap dans un buffer non managé.

    Le constructeur Bitmap peut prendre un IntPtr mais cela ne donne pas accès aux données par la suite. Les données sont copiées et gérées par le GC : aucun pointeur n'est valable sur ces données... Sauf exception : on peut récupérer les données image avec Bitmap.LockBits()
    Il suffit de copier les données à partir du pointeur accessible avec le BitmapData dans le buffer alloué par l'appelant C++.
    On ne peut pas faire boire un âne qui n'a pas soif.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Merci NicolasG,

    en fait je voulais simplement savoir comment copier le contenu du bitmap chargé apartir du disque dur dans le contenu du bitmap créé/lié à mon pointeur int C++...MAIS...ta solution me semble meilleur pour mon application... Merci bcp à nouveau, je vais essayer avec un BitmapData et si ça marche comme voulu je classerai ce thread comme resolu ...merci mille fois. Bonne fin d'année et bonne année 2006

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

Discussions similaires

  1. [vba-e] Comment Copier Un Textbox Vers Un Fichier
    Par KKshi666 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/05/2007, 15h21
  2. [VBA]comment copier une ligne vers un autre classeur
    Par iboulaye1980 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/05/2007, 18h22
  3. comment copier une table vers un fichier texte ou le contraire
    Par kham40 dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/11/2006, 13h51
  4. cherche comment copier le champ vers une autre champ
    Par khier dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 01/07/2005, 12h20
  5. Comment copier un bitmap d'une image à une autre?
    Par gord's dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2003, 13h07

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