【问题标题】:Snapshot of an WPF Canvas Area using RenderTargetBitmap使用 RenderTargetBitmap 的 WPF 画布区域的快照
【发布时间】:2013-01-02 06:52:48
【问题描述】:

我想在我的应用程序中创建画布区域的快照。我正在使用视觉画笔来获取快照并使用 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);
    }

}   

【问题讨论】:

    标签: wpf png snapshot rendertargetbitmap


    【解决方案1】:

    不确定为什么您的代码无法正常工作。这有效:

    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
    • 您可以在调用 Render 之前对元素调用 InvalidateVisual
    • UpdateLayout
    • 对不起克莱门斯。你的回答是对的。但是我错误地加载了 UIElement,这是错误。
    【解决方案2】:

    感谢您的提问和回答。

    为了寻找相同答案的其他人的利益

    我发现 Clemens 方式在图像中留下了一条黑色带,图像向下或向右移动。好像它没有在位图中的正确位置渲染元素。

    所以我不得不按照 Amar 的建议使用 VisualBrush。

    这是对我有用的代码:

        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;
        }
    

    【讨论】:

      猜你喜欢
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多