使用RenderTargetBitmap的WPF画布区域快照
我想在我的应用程序中创建画布区域的快照。我正在使用Visual brush获取快照,并使用PngEncoder保存快照。但最终的PNG只是一个空的黑色图像。我不确定问题是否与创建的BitmapSource或PNGEncoder问题有关。下面是我用来获得相同结果的代码使用RenderTargetBitmap的WPF画布区域快照,wpf,png,snapshot,rendertargetbitmap,Wpf,Png,Snapshot,Rendertargetbitmap,我想在我的应用程序中创建画布区域的快照。我正在使用Visual brush获取快照,并使用PngEncoder保存快照。但最终的PNG只是一个空的黑色图像。我不确定问题是否与创建的BitmapSource或PNGEncoder问题有关。下面是我用来获得相同结果的代码 public void ConvertToBitmapSource(UIElement element) { var target = new RenderTargetBitmap((int)(element.RenderS
public void ConvertToBitmapSource(UIElement element)
{
var target = new RenderTargetBitmap((int)(element.RenderSize.Width), (int)(element.RenderSize.Height), 96, 96, PixelFormats.Pbgra32);
var brush = new VisualBrush(element);
var visual = new DrawingVisual();
var drawingContext = visual.RenderOpen();
drawingContext.DrawRectangle(brush, null, new Rect(new Point(0, 0),
new Point(element.RenderSize.Width, element.RenderSize.Height)));
drawingContext.Close();
target.Render(visual);
PngBitmapEncoder encoder = new PngBitmapEncoder();
BitmapFrame outputFrame = BitmapFrame.Create(target);
encoder.Frames.Add(outputFrame);
using (FileStream file = File.OpenWrite("TestImage.png"))
{
encoder.Save(file);
}
}
不知道你的代码为什么不工作。这项工作:
public void WriteToPng(UIElement element, string filename)
{
var rect = new Rect(element.RenderSize);
var visual = new DrawingVisual();
using (var dc = visual.RenderOpen())
{
dc.DrawRectangle(new VisualBrush(element), null, rect);
}
var bitmap = new RenderTargetBitmap(
(int)rect.Width, (int)rect.Height, 96, 96, PixelFormats.Default);
bitmap.Render(visual);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
using (var file = File.OpenWrite(filename))
{
encoder.Save(file);
}
}
谢谢你们的提问和回答 为了其他寻找相同答案的人的利益 我发现Clemens way在图像中留下了一条黑带,图像要么向下移动,要么向右移动。就好像它没有在位图中的正确位置渲染元素一样 所以我不得不按照阿马尔的建议使用视觉刷 以下是对我有用的代码:
RenderTargetBitmap RenderVisual(UIElement elt)
{
PresentationSource source = PresentationSource.FromVisual(elt);
RenderTargetBitmap rtb = new RenderTargetBitmap((int)elt.RenderSize.Width,
(int)elt.RenderSize.Height, 96, 96, PixelFormats.Default);
VisualBrush sourceBrush = new VisualBrush(elt);
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
using (drawingContext)
{
drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0),
new Point(elt.RenderSize.Width, elt.RenderSize.Height)));
}
rtb.Render(drawingVisual);
return rtb;
}
很抱歉延迟回复。我尝试了所有的方法,我得到的只是一个黑色的图像。我不知道我哪里出错了@Clemens你可以在调用Render之前调用元素。或者。对不起,Clemens。你的回答是对的。但是我错误地加载了UIElement,这就是错误所在。