gpt4 book ai didi

c# - RenderTargetBitmap 位置问题

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:20 27 4
gpt4 key购买 nike

目标

使用 RenderTargetBitmap 截取一个控件(或一组控件)的屏幕截图。

来源:

<Grid Height="200" Width="500">
<!-- Here goes any content, in my case, a Label or a Shape-->
<Label VerticalAligment="Top" HorizontalAligment="Left" Content="Text">
</Grid>

预期结果:

Expected

方法一

这个基本上使用 UIElement 作为 RenderTargetBitmap 的来源。

public static ImageSource GetRender(this UIElement source)
{
double actualHeight = source.RenderSize.Height;
double actualWidth = source.RenderSize.Width;

var renderTarget = new RenderTargetBitmap((int)Math.Round(actualWidth),
(int)Math.Round(actualHeight), 96, 96, PixelFormats.Pbgra32);

renderTarget.Render(source);
return renderTarget;
}

结果:

Method 1 Result

方法二:

我将使用 VisualBrush,而不是直接将 UIElement 设置为 RenderTargetBitmap 的源。

//Same RenderTargetBitmap...

DrawingVisual dv = new DrawingVisual();
using (DrawingContext ctx = dv.RenderOpen())
{
VisualBrush vb = new VisualBrush(target);
ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
}
rtb.Render(dv);

结果:

这个忽略了 Grid 和里面的 Label 的位置和大小:

enter image description here

这里发生了什么?

最佳答案

修改方法2

我只需要获取 Grid 的后代的边界并只渲染需要的部分。

public static ImageSource GetRender(this UIElement source, double dpi)
{
Rect bounds = VisualTreeHelper.GetDescendantBounds(source);

var scale = dpi / 96.0;
var width = (bounds.Width + bounds.X)*scale;
var height = (bounds.Height + bounds.Y)*scale;

RenderTargetBitmap rtb =
new RenderTargetBitmap((int)Math.Round(width, MidpointRounding.AwayFromZero),
(int)Math.Round(height, MidpointRounding.AwayFromZero),
dpi, dpi, PixelFormats.Pbgra32);

DrawingVisual dv = new DrawingVisual();
using (DrawingContext ctx = dv.RenderOpen())
{
VisualBrush vb = new VisualBrush(source);
ctx.DrawRectangle(vb, null,
new Rect(new Point(bounds.X, bounds.Y), new Point(width, height)));
}

rtb.Render(dv);
return (ImageSource)rtb.GetAsFrozen();
}

结果:

呈现的Label/Shape:

Rendered

与另一张图片合并:

Merged

关于c# - RenderTargetBitmap 位置问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32210690/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com