WPF截图功能,网上很多,但是面对Visual不在视觉树上面怎么截图呢?
思路很简单,我们只需要在截图前,将Visual做个提前布局即可。
我们在截图的过程中,会发现没有在视觉树上的元素的实际大小是0,这个时候我们就无法正确的截图。所以这种情况下,我们要么选择高宽属性进行赋值,要么由外部参数来决定到底需要设置多大的宽高。
如果元素存在一定的缩放,还需要将缩放比考虑进去。
具体代码如下:
public static BitmapSource Snap(this FrameworkElement element, double scale, int desiredHeight, int desiredWidth)
{
var width = (int)(element.ActualWidth);
if (width == 0)
{
width = desiredWidth;
}
var height = (int)(element.ActualHeight);
if (height == 0)
{
height = desiredHeight;
}
if (!element.IsLoaded)
{
element.Arrange(new Rect(0, 0, width, height));
element.Measure(new Size(width, height));
}
var scaleWidth = (int)(width * scale);
var scaleHeight = (int)(height * scale);
var bitmap = new RenderTargetBitmap(scaleWidth, scaleHeight, 96.0, 96.0, PixelFormats.Pbgra32);
var rectangle = new Rectangle
{
Width = scaleWidth,
Height = scaleHeight,
Fill = new VisualBrush(element)
{
Viewbox = new Rect(0, 0, width, height),
ViewboxUnits = BrushMappingMode.Absolute,
}
};
rectangle.Measure(new Size(scaleWidth, scaleHeight));
rectangle.Arrange(new Rect(new Size(scaleWidth, scaleHeight)));
bitmap.Render(rectangle);
return bitmap;
}
其他细节,各位看官可自行优化。比如:DPI。
本文会经常更新,请阅读原文: https://huchengv5.gitee.io//post/WPF-%E6%88%AA%E5%9B%BE%E5%8A%9F%E8%83%BD%E7%9A%84%E5%AE%9E%E7%8E%B0.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名胡承(包含链接: https://huchengv5.gitee.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。