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 :

Contrôle WPF Image et application des effets


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Par défaut Contrôle WPF Image et application des effets
    Bonjour,

    j'ai un contrôle Image (WPF) qui est initialisé avec un BitmapSource (via propriété .Source=).
    Je lui applique ensuite un effet (via propriété .Effect=). Le rendu visuel est modifié, mais je souhaite savoir s'il est possible (et si oui comment) de récupérer un objet BitmapSource (ou autre) correspondant à ce visuel.

    Merci.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 214
    Par défaut
    Tu peux utiliser je pense un VisualBrush qui va te permettre d'avoir une brush contenant n'importe quel élement de ton interface (plus précisément de n'importe quel Visual).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Par défaut
    Merci, je vais tester avec ça.

    Citation Envoyé par Jérem22 Voir le message
    Tu peux utiliser je pense un VisualBrush qui va te permettre d'avoir une brush contenant n'importe quel élement de ton interface (plus précisément de n'importe quel Visual).

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Par défaut
    Effectivement cela fonctionne, mais j'ai une petite complexité...
    Comment je peux forcer un control (visual) à se mettre à jour ? Je m'explique. Je souhaite appliquer un effect (shadeeffect) à une image, sans forcément que le contrôle 'Image' soit lui même afficher à l'écran. En gros :
    - je mets mon bitmapframe dans un contrôle Image
    - j'applique mon ShaderEffect
    - avec un visualbrush et RenderTargetBitmap, je récupère un nouveau BitmapFrame.

    Mais à priori cela ne fonctionne pas car le contrôle n'est pas affiché...

    Citation Envoyé par Jérem22 Voir le message
    Tu peux utiliser je pense un VisualBrush qui va te permettre d'avoir une brush contenant n'importe quel élement de ton interface (plus précisément de n'importe quel Visual).

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 214
    Par défaut
    Essayes d'appeler la méthode Arrange avant de générer le RenderTargetBitmap.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Par défaut
    Non ca ne change rien. Je mets ci-dessous un bout de code.
    Pour reformuler mon problème, je veux appliquer un effet (en l'occurrence ShaderEffect) sur un ensemble d'images. Et donc je passe par des composants Visual car ces effets ne semblent s'appliquer que sur des Visual.

    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
     
    Rect bounds = new Rect(0, 0, 200, 150);
    RenderTargetBitmap rtb = new RenderTargetBitmap(
            (Int32)(bounds.Width * 96 / 96.0),
            (Int32)(bounds.Height * 96 / 96.0),
            96,
            96,
            PixelFormats.Pbgra32);
    DrawingVisual dv = new DrawingVisual();
    VisualBrush vb = new VisualBrush(image1);
    using (DrawingContext dc = dv.RenderOpen())
    {
            dc.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
    }
    rtb.Render(dv);
    image2.Source = BitmapFrame.Create(rtb);
    Citation Envoyé par Jérem22 Voir le message
    Essayes d'appeler la méthode Arrange avant de générer le RenderTargetBitmap.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Par défaut
    En fait, si ca semble marcher je m'étais trompé dans l'objet appelant.
    Ca marche super bien, Merci.

    Je mets un exemple de code pour ceux qui en aurait éventuellement besoin.

    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
     
    System.Windows.Controls.Image image = new System.Windows.Controls.Image();
    image.Source = bmp;
    image.Effect = eff;
    // Récupération du bitmap
    Rect bounds = new Rect(0, 0, bmp.Width, bmp.Height);
    image.Arrange(bounds);
    RenderTargetBitmap rtb = new RenderTargetBitmap(
          (Int32)(bounds.Width * 96 / bmp.DpiX),
          (Int32)(bounds.Height * 96 / bmp.DpiY),
          bmp.DpiX,
          bmp.DpiY,
          PixelFormats.Pbgra32);
    DrawingVisual dv = new DrawingVisual();
    VisualBrush vb = new VisualBrush(image);
    using (DrawingContext dc = dv.RenderOpen())
    {
          dc.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
    }
    rtb.Render(dv);
    return BitmapFrame.Create(rtb);
    Citation Envoyé par guismo45 Voir le message
    Non ca ne change rien. Je mets ci-dessous un bout de code.
    Pour reformuler mon problème, je veux appliquer un effet (en l'occurrence ShaderEffect) sur un ensemble d'images. Et donc je passe par des composants Visual car ces effets ne semblent s'appliquer que sur des Visual.

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

Discussions similaires

  1. Ajouts "d'attributs" a des contrôles WPF
    Par istace.emmanuel dans le forum C#
    Réponses: 2
    Dernier message: 13/10/2009, 03h25
  2. Ajouter des images à mon application
    Par comrad85 dans le forum C++Builder
    Réponses: 9
    Dernier message: 25/03/2008, 17h47
  3. Réponses: 3
    Dernier message: 05/02/2008, 15h19
  4. Utiliser JOGL + shader pour des effets sur des images 2D.
    Par nouknouk dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 19/12/2007, 10h46
  5. Réponses: 4
    Dernier message: 03/10/2007, 12h59

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