Как объединить слои и сохранить как изображение в WPF? - PullRequest
1 голос
/ 08 октября 2009

У меня есть два слоя. Первый слой - это контроль изображения. Источником этого является растровое изображение. И это фоновый слой. Второй - передний слой - это холст, на котором я могу рисовать геометрические объекты (например, линии, полилинии, прямоугольники и т. Д.), А фон холста прозрачный. Как я могу объединить эти два слоя и сохранить его как изображение, используя WPF.

Ответы [ 3 ]

0 голосов
/ 08 октября 2009

Вы можете получить растровое изображение родительской панели, на которой вы разместили свой элемент управления изображением и холст.

Как код получить растровое изображение UIElement в WPF.

 RenderTargetBitmap bmp = new RenderTargetBitmap(Width, Height, 96, 96, PixelFormats.Pbgra32);
bmp.Render(parentPanel);
0 голосов
/ 10 ноября 2016

Используйте что-то вроде, вызовите этот метод из вашего холста (это холст) -

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);
    }
0 голосов
/ 08 октября 2009

Что вы подразумеваете под "Слоями"? Просто два элемента управления сидели в одной ячейке сетки? Если у вас есть оба «слоя» в другом контейнере (например, в сетке или даже в окне), вы можете использовать RenderTargetBitmap с этим контейнером для получения изображения. У меня есть некоторые подробности, метод расширения для с использованием WPF «Скриншоты» в моем блоге.

...