如何将画布渲染为位图,排除超出边界的元素(c# WinRT)
本文关键字:边界 元素 WinRT 排除 布渲染 位图 | 更新日期: 2023-09-27 18:02:24
我有一个简单的绘画应用程序,我试图使用RenderTargetBitmap.RenderAsync()方法将画布渲染成位图。如果画布的子元素超出画布边界,则渲染的位图将大于画布面积…我怎样才能避免这种情况,只渲染边界内的元素?我尝试了画布的clip属性,但它只适用于UI,不适用于渲染。
我也遇到过同样的问题。以下是对我有用的:
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轻松添加