Domanda

Ho due strati. Il primo strato è controllo Image. La fonte di esso è immagine bitmap. E questo è il livello di sfondo. Il secondo, che è lo strato anteriore è una tela su cui posso disegnare oggetti geometrici (come linea, polilinea, rettangolo ecc) e lo sfondo della tela è trasparente.    Come posso unire questi due strati e salvarlo come un'immagine utilizzando WPF.

È stato utile?

Soluzione

Che cosa si intende per "Livelli"? Solo due controlli seduti nella stessa cella di una griglia? Se si dispone di entrambi gli "strati" seduto in un altro contenitore (come ad esempio una griglia, o anche la finestra), allora si può usare RenderTargetBitmap con quel contenitore per ottenere la vostra immagine. Ho alcuni dettagli, un metodo di estensione per prendendo WPF "Screenshots" su il mio blog.

Altri suggerimenti

È possibile ottenere bitmap del pannello di genitore sul quale avete posto il vostro controllo dell'immagine e tela.

Come è il codice per ottenere la bitmap di UIElement in WPF.

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

usare qualcosa di simile, richiamarlo da tua tela (questo è tela) -

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);
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top