【问题标题】:how to render canvas to bitmap excluding out of bounds elements (C# WinRT)如何将画布渲染到位图,不包括越界元素(C# WinRT)
【发布时间】:2014-06-25 16:09:08
【问题描述】:
我有一个简单的绘画应用程序,我正在尝试使用 RenderTargetBitmap.RenderAsync() 方法将画布渲染为位图。
如果画布的子元素超出画布边界,则渲染的位图大于画布区域......我怎样才能避免这种情况并只渲染边界内的元素?
我尝试了画布的 clip 属性,但它仅适用于 UI ,不适用于渲染。
ClipToBounds 在 WinRT 中不可用...
【问题讨论】:
标签:
c#
canvas
render
bounds
writeablebitmap
【解决方案1】:
我遇到了同样的问题。这对我有用:
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 不会渲染所有超出范围的内容。
ClipToBounds 功能可以通过 AttachedProperty 轻松添加:details