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 :

[Imaging] Détourner WPF pour générer des images


Sujet :

Windows Presentation Foundation

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 8
    Points
    8
    Par défaut [Imaging] Détourner WPF pour générer des images
    Bonjour à tous,

    J'expérimente une bidouille actuellement. Je souhaite générer des images à partir de contrôle/template WPF etc.

    Mon code actuellement est plutot standard et consiste:
    - à créer une fenetre,
    - créer un "screen shot" de la fenêtre pour enregistrer la fenetre dans un stream.

    malheureusement, le contenu de la fenêtre ne s'affiche que si j'ai fait un Show().

    Y'a t'il un moyen de créer le contenu graphique d'une fenetre sans l'afficher ?

    Si j'expérimente cette bidouille c'est parce qu'au final mon afficheur sera un écran LCL 192x32 pixels monochrome et que je souhaite profiter de la souplesse WPF pour pousser le graphique généré côté hôte pour le pousser sur l'afficheur...

    Si vous avez des pistes ou des idées je suis preneur
    merci d'avance.

    R.

  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 : 43
    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 753
    Points
    39 753
    Par défaut
    Tu dois pouvoir faire un truc comme ça :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Window1 window = new Window1();
     
    VisualBrush visualBrush = new VisualBrush(window);
    Rect rect = new Rect(window.Left, window.Top, window.Width, window.Height);
     
    DrawingVisual drawingVisual = new DrawingVisual();
    DrawingContext drawingContext = drawingVisual.RenderOpen();
    drawingContext.DrawRectangle(visualBrush, null, rect);
    drawingContext.Close()
     
    RenderTargetBitmap bitmap = new RenderTargetBitmap(window.Width, window.Height, 96, 96, PixelFormats.Pbgra32);
    bitmap.Render(drawingVisual);

    Le bitmap obtenu devrait contenir l'image de la fenêtre.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    je teste ca prochainement.

    merci pour la piste, je vous tiens au courant !

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    c'est un échec

    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
     
    Window window = new Window();
    window.Width = 500;
    window.Height = 500;
     
    StackPanel panel = new StackPanel();
    window.Content = panel;
     
    TextBox textbox = new TextBox();
    textbox.Text = "Test";
    panel.Children.Add(textbox);
     
    window.Show();
     
    VisualBrush visualBrush = new VisualBrush(window);
    Rect drawingRect = new Rect(window.Left, window.Top, window.Width, window.Height);
    DrawingVisual drawingVisual = new DrawingVisual();
    DrawingContext drawingContext = drawingVisual.RenderOpen();
    drawingContext.DrawRectangle(visualBrush, null, drawingRect);
    drawingContext.Close();
    RenderTargetBitmap bitmap = new RenderTargetBitmap((int)window.Width, (int)window.Height, 96, 96, PixelFormats.Pbgra32);
    bitmap.Render(drawingVisual);
     
    using (FileStream stream = new FileStream("c:/tmp/test.bmp", FileMode.Create))
                {
                    BmpBitmapEncoder encoder = new BmpBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(bitmap));
                    encoder.Save(stream);
                }

    si j'enlève le window.Show() dans le code ci-dessus j'obtiens une image noire

    Quelqu'un a t'il un piste ?
    j'ai essayé avec UpdateLayout() mais ca rend la même chose.

  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 : 43
    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 753
    Points
    39 753
    Par défaut
    Petite suggestion... et si tu essayais de dessiner le contenu de la fenêtre plutôt que la fenêtre elle-même ?

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Petite suggestion... et si tu essayais de dessiner le contenu de la fenêtre plutôt que la fenêtre elle-même ?
    je n'ai peut-être pas bien compris ton idée.
    j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    VisualBrush visualBrush = new VisualBrush(window);
    VisualBrush visualBrush = new VisualBrush(panel);
    VisualBrush visualBrush = new VisualBrush(textbox);
    le résultat est le même. en fait le brush a l'air de ne pas être initialisé car le contenu de la fenêtre n'est pas chargé / construit.

    par exemple j'ai inséré un UserControl via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ClockControl clockControl = new ClockControl();
    panel.Children.Add(clockControl);
    ce control inscrit un handler sur l'event Loaded. Mon handler n'est pas appelé si je ne fais pas le show sur la fenêtre

    j'en suis donc au même point: comment "construire/charger" une fenêtre sans l'afficher ?

  7. #7
    Membre averti

    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
    Points : 341
    Points
    341
    Par défaut
    Tu peux essayer d'appeler la méthode Arrange() avant de faire ta VisualBrush. Sur un cas je m'en étais sortis comme ça

  8. #8
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    pas mieux

Discussions similaires

  1. [Image]Alternative à GD pour superposer des images
    Par Invité4 dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 14/01/2006, 18h13
  2. [FLASH MX2004] Générer des images
    Par sami_c dans le forum Flash
    Réponses: 2
    Dernier message: 09/01/2006, 11h05
  3. [MySQL] conseils pour gérer des images avec mysql
    Par briiice dans le forum Administration
    Réponses: 9
    Dernier message: 04/01/2006, 09h52
  4. [Recherche] Recherche un logiciel pour assembler des images
    Par Furius dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 29/12/2005, 18h03
  5. Réponses: 3
    Dernier message: 02/12/2005, 13h23

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