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 :

Probleme avec Bitblt


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 3
    Par défaut Probleme avec Bitblt
    Je n'arrive pas à copier le bitmap source dans le bitmap target avec cette procédure. Je voudrais absolument utiliser BitBlt car à priori ce sera plus rapide que drawimage...

    L'appel à picturebox1.Image=target m'affiche désespérement du vide alors que si je remplace par picturebox1.Image = source l'image est bien affichée...

    Merci de votre aide je débute en C#

    Code : 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
        private void CopyBitmap()
            {
                Bitmap source = new Bitmap("c://ESSAI.bmp");
                Graphics gSource = Graphics.FromImage(source);
                Bitmap target = new Bitmap(source.Width, source.Height);
                Graphics gDest = Graphics.FromImage(target);
                IntPtr sourceDC = gSource.GetHdc();
                IntPtr destDC = gDest.GetHdc();
     
                BitBlt(destDC, 0, 0, source.Width, source.Height, sourceDC, 0, 0, 13369376);
                pictureBox1.Image = target;
     
                gDest.ReleaseHdc(destDC);
                gSource.ReleaseHdc(sourceDC);
                gDest.Dispose();
                gSource.Dispose();
     
            }
    Voici la déclaration pour BitBlt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [System.Runtime.InteropServices.DllImportAttribute(
                     "gdi32.dll")]
            private static extern bool BitBlt(
                        IntPtr hdcDest, // handle to destination DC
                        int xDest, // x coord of the dest upper left corner
                        int yDest, // y coord of the dest upper left corner
                        int width, // width of the destination rectangle
                        int height, // height of the destination rectangle
                        IntPtr hdcSrc, // handle to source DC
                        int xSrc, // x coord of the source upper left corner
                        int ySrc, // y coord of the source upper left corner
                        Int32 dwRop // raster operation code
                        );

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 3
    Par défaut
    Personne pour m'aider...

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Je ne connais pas BitBlt et découvre cette fonction

    Qu'est-ce que la valeur 13369376 ? est-ce SRCCOPY ?

    Voici des liens que j'ai trouvé sur BitBlt :http://msdn2.microsoft.com/en-us/lib...78(VS.85).aspx
    http://msdn2.microsoft.com/en-us/lib...14(VS.85).aspx

    Si ça peut t'aider.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 3
    Par défaut
    Oui c'est bien SRCCOPY, merci pour ton aide je vais voir ce que je peux faire avec tes liens...(notamment le 2eme)

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    En réalité c'est normal que target reste vide.

    Un objet Image représente un bitmap en mémoire.

    Un Graphics et en l'occurence le displaycontext est autre chose...
    Ce que tu fait c'est instancier un Graphics en lui donnant comme source ton image destination qui est vide.
    Puis tu modifie le contenu de Graphics qui offre un DiplayContext, mais les modifications effectuées ne sont faites que dans le DC de Graphics... AUCUNEMENT dans l'Image qui a servit à créer le DC.
    Ce sont deux choses SEPAREES, au niveau du noyau de windows, techniquement parlant le l'instance bitmap de target a tjs son buffer identique et il est VIDE !

    quand tu fait pictureBox1.Image = target il est normal que ca reste vide, puisque techniquement ton bitmap est tjs vide.

    Globallement un Graphics c un objet qui permet de dessiner sur un canevas d'affichage, il dispose de son propre contexte d'affichage qui est un buffer mémoire... ce buffer mémoire est indépendant de celui qui sert à stocker l'image.
    Une image en l'occurence un bitmap, un jpg, un png ce n'est pas qu'un buffer mémoire avec la projection des bits dedans.
    Il faut savoir par exemple que ton displaycontext dans le cas d'un systeme moderne dispose d'un buffer de 32bits par pixels dans le contexte, dans le sens ou il suffit de faire un mappage sur cette zone pour l'afficher.
    Un bitmap en mémoire n'est pas affichable directement en le copiant en mémoire vidéo en fait. Tout dépend du bitmap et de plus le stockage n'est pas rigoureusement identique à celui de l'affichage.

    Tu peux assimiler une image a un programme. Si tu veux modifier le programme tu édite les sources et le RECOMPILE et bien là c'est pareil, mais tu ne modifie pas comme un sauvage les octets dans le fichier (ou dans sa représentation mémoire) Tu ne refait pa une compilation a chaud en espérant que les changements faits soient pris en compte aussitot en mémoire...

    Je sais pas si tu comprend bien ou je veux en venir... j'avoue avoir un peu de mal a l'expliquer et surtout à trouver une analogie frappante.

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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