如何将画布渲染为位图,排除超出边界的元素(c# WinRT)

本文关键字:边界 元素 WinRT 排除 布渲染 位图 | 更新日期: 2023-09-27 18:02:24

我有一个简单的绘画应用程序,我试图使用RenderTargetBitmap.RenderAsync()方法将画布渲染成位图。如果画布的子元素超出画布边界,则渲染的位图将大于画布面积…我怎样才能避免这种情况,只渲染边界内的元素?我尝试了画布的clip属性,但它只适用于UI,不适用于渲染。

如何将画布渲染为位图,排除超出边界的元素(c# WinRT)

我也遇到过同样的问题。以下是对我有用的:

        Rect r = new Rect(new Point(0, 0), new Point(canvas.Width, canvas.Height));
        foreach (var c in canvas.Children)
            c.Clip = new RectangleGeometry() { Rect = r };

        RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
        await renderTargetBitmap.RenderAsync(canvas, (int)canvas.Width, (int)canvas.Height);
        FileSavePicker picker = new FileSavePicker();
        picker.FileTypeChoices.Add("JPEG Image", new string[] { ".jpg" });
        StorageFile file = await picker.PickSaveFileAsync();
        if (file != null)
        {
            var pixels = await renderTargetBitmap.GetPixelsAsync();
            using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
            {
                var encoder = await
                BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
                byte[] bytes = pixels.ToArray();
                encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                    BitmapAlphaMode.Ignore,
                    (uint)canvas.Width, (uint)canvas.Height,
                    96, 96, bytes);
                await encoder.FlushAsync();
            }
        }

基本上,你只是将Clip添加到所有Canvas的子元素中,所以所有超出界限的东西都不会被RenderTargetBitmap渲染。


cliptobound功能可以通过AttachedProperty: details轻松添加