繁体   English   中英

WPF,将 3 个 RenderTargetBitmap 合并为一个

[英]WPF, merge 3 RenderTargetBitmap to one

嗨,我有一个问题。

我有一个方法(扩展),它获取 FrameworkElement 列表并从中创建图像,然后它应该从这些图像中创建一个图像并将其复制到剪贴板。

我的代码看起来像:

    public static void CopyManyUiElementToClipboard(List<FrameworkElement> elements)
    {
        var images = new List<RenderTargetBitmap>();
        elements.ForEach(element =>
        {
            double width = element.ActualWidth;
            double height = element.ActualHeight;
            var size = new Size(width, height);

            var drawingContext = new DrawingVisual();
            using (DrawingContext draw = drawingContext.RenderOpen())
            {
                var visualBrush = new VisualBrush(element);
                draw.DrawRectangle(visualBrush, null, new Rect(new Point(), size));
            }

            var renderBitmap = new RenderTargetBitmap((int)size.Width, (int)size.Height,96d,96d,PixelFormats.Pbgra32);
            var vRect = new Rectangle
            {
                Width = (int)size.Width,
                Height = (int)size.Height,
                Fill = Brushes.White
            };

            vRect.Arrange(new Rect(size));
            renderBitmap.Render(vRect);
            renderBitmap.Render(drawingContext);

            images.Add(renderBitmap);
        });
    }

它从所有 ui 元素创建图像并将其添加到集合中,但我找不到创建图像的方法(当然是内存)。

如果我为每个循环将所有图像添加到剪贴板

 Clipboard.SetImage(renderBitmap);

它复制最后一个图像(这是有道理的,这就是为什么我想从 3 个图像中创建单个图像)。

有任何想法吗?

好的,我找到了一种方法,对于任何感兴趣的人:

    public static void CopyManyUiElementToClipboard(List<FrameworkElement> elements)
    {
        double totalWidth = elements.First().ActualWidth;
        double totalHeight = elements.Sum(element => element.ActualHeight);

        var size = new Size(totalWidth, totalHeight);
        var rectangleFrame = new Rectangle
        {
            Width = (int)size.Width,
            Height = (int)size.Height,
            Fill = Brushes.White
        };

        rectangleFrame.Arrange(new Rect(size));
        var renderBitmap = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96d, 96d, PixelFormats.Pbgra32);
        renderBitmap.Render(rectangleFrame);

        var yPointCordinate = 0.0;
        elements.ForEach(element =>
        {
            var drawingContext = new DrawingVisual();

            using (DrawingContext draw = drawingContext.RenderOpen())
            {
                var visualBrush = new VisualBrush(element);
                var elementSize = new Size(element.ActualWidth, element.ActualHeight);
                draw.DrawRectangle(visualBrush, null, new Rect(new Point(0, yPointCordinate), elementSize));
            }

            yPointCordinate += element.ActualHeight;
            renderBitmap.Render(drawingContext);
        });

        Clipboard.SetImage(renderBitmap);
    }

作为参数函数采用 FrameworkElements 列表,它为每个元素创建单独的位图并使用 y 点操作呈现全图,例如取高你的最后一个元素并使其成为你新位图的起始 y 点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM