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

Windows Presentation Foundation Discussion :

ImageDrawing, Bitmap et Ressource


Sujet :

Windows Presentation Foundation

  1. #1
    Membre expérimenté Avatar de g0up1l
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 341
    Par défaut ImageDrawing, Bitmap et Ressource
    Bonjour,

    je souhaite construire un objet ImageDrawing basé sur un bitmap stocké sur le disque. Jusqu'à présent, tout allait bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ImageSourceConverter conv = new ImageSourceConverter();
     
    new ImageDrawing(
                        (ImageSource)conv.ConvertFromString(cheminDuBitmap),
                        new System.Windows.Rect(
                            0,
                            0,
                            Largeur,
                            Hauteur
                            )));
    A présent, je souhaite réaliser la même chose à partir d'une image stockée dans les 'Resources' de l'assembly :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    Bitmap bmp = Affichage.Properties.Resources.punaise_centre;
     
     System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height);
                         System.Drawing.Imaging.BitmapData bmpData =
                             bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
                             bmp.PixelFormat);
     
                         // Get the address of the first line.
                         IntPtr ptr = bmpData.Scan0;
     
                         // Declare an array to hold the bytes of the bitmap.
                         int bytes = bmpData.Stride * bmp.Height;
                         byte[] rgbValues = new byte[bytes];
     
                         // Copy the RGB values into the array.
                         System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
     
                        PixelFormat pf = PixelFormats.Bgr32;
     
                        int rawStride = (bmp.Width * pf.BitsPerPixel + 7) / 8;
     
                         //// Create a BitmapSource.
                         BitmapSource bitmap = BitmapSource.Create(bmp.Width, bmp.Height,
                             96, 96, pf, null,
                             rgbValues, rawStride);
     
                            ImageDrawing ig = new ImageDrawing(
                                (ImageSource)bitmap,
                                 new System.Windows.Rect(
                                    pixW,
                                    pixH,
                                    size.Width,
                                    size.Height
                                    ));
    Quelqu'un a-t-il une autre idée plus simple ? J'ai essayé pas mal de chose mais je n'ai trouvé aucune compatibilité entre BitmapImage et Bitmap.
    Et sinon, le gros problème est que je perds la couleur de transparence de l'image d'origine !
    Une solution pour ça ??

  2. #2
    Membre expérimenté Avatar de g0up1l
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 341
    Par défaut
    Citation Envoyé par g0up1l Voir le message
    Bonjour,

    je souhaite construire un objet ImageDrawing basé sur un bitmap stocké sur le disque. Jusqu'à présent, tout allait bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ImageSourceConverter conv = new ImageSourceConverter();
     
    new ImageDrawing(
                        (ImageSource)conv.ConvertFromString(cheminDuBitmap),
                        new System.Windows.Rect(
                            0,
                            0,
                            Largeur,
                            Hauteur
                            )));
    A présent, je souhaite réaliser la même chose à partir d'une image stockée dans les 'Resources' de l'assembly :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    Bitmap bmp = Affichage.Properties.Resources.punaise_centre;
     
     System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height);
                         System.Drawing.Imaging.BitmapData bmpData =
                             bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
                             bmp.PixelFormat);
     
                         // Get the address of the first line.
                         IntPtr ptr = bmpData.Scan0;
     
                         // Declare an array to hold the bytes of the bitmap.
                         int bytes = bmpData.Stride * bmp.Height;
                         byte[] rgbValues = new byte[bytes];
     
                         // Copy the RGB values into the array.
                         System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
     
                        PixelFormat pf = PixelFormats.Bgr32;
     
                        int rawStride = (bmp.Width * pf.BitsPerPixel + 7) / 8;
     
                         //// Create a BitmapSource.
                         BitmapSource bitmap = BitmapSource.Create(bmp.Width, bmp.Height,
                             96, 96, pf, null,
                             rgbValues, rawStride);
     
                            ImageDrawing ig = new ImageDrawing(
                                (ImageSource)bitmap,
                                 new System.Windows.Rect(
                                    pixW,
                                    pixH,
                                    size.Width,
                                    size.Height
                                    ));
    Quelqu'un a-t-il une autre idée plus simple ? J'ai essayé pas mal de chose mais je n'ai trouvé aucune compatibilité entre BitmapImage et Bitmap.
    Et sinon, le gros problème est que je perds la couleur de transparence de l'image d'origine !
    Une solution pour ça ??
    Bon, j'ai déjà trouvé une solution pour la transparence, il suffit de notifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PixelFormat pf = PixelFormats.Bgra32;
    au lieu de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PixelFormat pf = PixelFormats.Bgr32;

  3. #3
    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 : 44
    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
    Par défaut
    Inutile de réinventer la roue
    Il y a une méthode qui sert à convertir un bitmap GDI+ (System.Drawing.Bitmap) en ImageSource :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    using System.Windows.Interop;
     
    ...
     
     
    Bitmap bitmap = Affichage.Properties.Resources.punaise_centre;
    BitmapSource bitmapSource =
        Imaging.CreateBitmapSourceFromHBitmap(
            bitmap.GetHBitmap(),
            IntPtr.Zero,
            Int32Rect.Empty,
            BitmapSizeOptions.FromEmptyOptions());

    Par contre, en général on n'utilise pas les ressources .resx en WPF, du moins pas pour les images... tu as une raison particulière de vouloir faire comme ça ?

  4. #4
    Membre expérimenté Avatar de g0up1l
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 341
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Inutile de réinventer la roue
    Il y a une méthode qui sert à convertir un bitmap GDI+ (System.Drawing.Bitmap) en ImageSource :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    using System.Windows.Interop;
     
    ...
     
     
    Bitmap bitmap = Affichage.Properties.Resources.punaise_centre;
    BitmapSource bitmapSource =
        Imaging.CreateBitmapSourceFromHBitmap(
            bitmap.GetHBitmap(),
            IntPtr.Zero,
            Int32Rect.Empty,
            BitmapSizeOptions.FromEmptyOptions());

    Par contre, en général on n'utilise pas les ressources .resx en WPF, du moins pas pour les images... tu as une raison particulière de vouloir faire comme ça ?
    oui en fait j'utilise les images en ressources car je développe un composant autonome qui propose des images par défauts. Et je préfère les compiler en ressources, plutôt que de trainer un dossier 'images' dans le déploiement

    en tout cas, merci de ta réponse !

  5. #5
    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 : 44
    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
    Par défaut
    Citation Envoyé par g0up1l Voir le message
    oui en fait j'utilise les images en ressources car je développe un composant autonome qui propose des images par défauts. Et je préfère les compiler en ressources, plutôt que de trainer un dossier 'images' dans le déploiement
    Dans un projet WPF, les fichiers pour lesquels tu mets Build Action = Resource sont compilés comme ressources dans l'assembly, donc au déploiement ce ne sont pas des fichiers séparés...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/03/2008, 17h02
  2. Charger un bitmap a partir d'un ressource dll
    Par jagboys dans le forum MFC
    Réponses: 4
    Dernier message: 06/12/2006, 20h00
  3. Réponses: 10
    Dernier message: 18/03/2006, 12h35
  4. [Update : Code solution][Bitmap] Se passer des ressources
    Par Clorish dans le forum Composants VCL
    Réponses: 13
    Dernier message: 13/07/2005, 12h16
  5. Réponses: 3
    Dernier message: 31/01/2005, 15h22

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