Question

J'ai deux couches. La première couche est le contrôle de l'image. La source de c'est Bitmap Image. Et c'est la couche de fond. Le second, qui est la couche avant est une toile sur laquelle je peux dessiner des objets géométriques (telles que la ligne, polyligne, rectangle, etc.) et l'arrière-plan de la toile est transparente.    Comment puis-je fusionner ces deux couches et l'enregistrer comme une image en utilisant WPF.

Était-ce utile?

La solution

Que voulez-vous dire par « couches »? Juste deux contrôles étaient assis dans la même cellule d'une grille? Si vous avez les deux « couches » assis dans un autre récipient (comme une grille, ou même la fenêtre), vous pouvez utiliser RenderTargetBitmap avec ce conteneur pour obtenir votre image. J'ai quelques détails, une méthode d'extension pour prendre WPF « Captures d'écran » sur mon blog.

Autres conseils

Vous pouvez obtenir bitmap de votre panneau parent sur lequel vous avez placé votre commande d'image et de la toile.

Comment est le code pour obtenir le bitmap de UIElement dans WPF.

 RenderTargetBitmap bmp = new RenderTargetBitmap(Width, Height, 96, 96, PixelFormats.Pbgra32);
bmp.Render(parentPanel);

Utilisez quelque chose comme, appeler cette méthode à partir de votre toile (ce qui est la toile) -

private Bitmap ImageGenerator()
    {
        var transform = this.LayoutTransform;
        // Call UpdateLayout to make sure changes all changes 
        // while drawing objects on canvas are reflected
        var layer = AdornerLayer.GetAdornerLayer(this);
        layer?.UpdateLayout();
        // Get the size of canvas
        var size = new System.Windows.Size(this.ActualWidth, this.ActualHeight);
        // Measure and arrange the surface
        // VERY IMPORTANT
        this.Measure(size);
        this.Arrange(new Rect(RenderSize));

        RenderTargetBitmap renderBitmap =
                     new RenderTargetBitmap(
                       (int)this.ActualWidth,
                       (int)this.ActualHeight,
                       96d,
                       96d,
                       PixelFormats.Pbgra32);
        renderBitmap.Render(this);

        JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        // push the rendered bitmap to it
        encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
        var stream = new MemoryStream();
        encoder.Save(stream);
        this.LayoutTransform = transform;
        return new Bitmap(stream);
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top