Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用RenderTargetBitmap的WPF画布区域快照_Wpf_Png_Snapshot_Rendertargetbitmap - Fatal编程技术网

使用RenderTargetBitmap的WPF画布区域快照

使用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

我想在我的应用程序中创建画布区域的快照。我正在使用Visual brush获取快照,并使用PngEncoder保存快照。但最终的PNG只是一个空的黑色图像。我不确定问题是否与创建的BitmapSource或PNGEncoder问题有关。下面是我用来获得相同结果的代码

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,这就是错误所在。