【问题标题】:How do I save all content of a WPF ScrollViewer as an image如何将 WPF ScrollViewer 的所有内容保存为图像
【发布时间】:2014-09-16 01:00:15
【问题描述】:

我有一个带有 ScrollViewer 控件的 WPF 窗口,其中包含许多垂直扩展的子控件。当用户单击位于 ScrollViewer 底部的按钮时,我希望将所有内容(当前可见和不可见)保存为图像。

我正在使用以下代码,这些代码从示例中改编而来,展示了如何保存窗口的内容:

public static void SaveForm(ScrollViewer container, string filename)
{        
    const int dpi = 96;
    var rtb = new RenderTargetBitmap(
        (int)container.ExtentWidth, //width 
        (int)container.ExtentHeight, //height 
        dpi, //dpi x 
        dpi, //dpi y 
        PixelFormats.Pbgra32 // pixelformat 
        );

    rtb.Render(container);
    SaveRTBAsPNG(rtb, filename);
}

private static void SaveRTBAsPNG(RenderTargetBitmap bmp, string filename)
{
    var enc = new System.Windows.Media.Imaging.PngBitmapEncoder();
    enc.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(bmp));

    using (var stm = System.IO.File.Create(filename))
    {
        enc.Save(stm);
    }
}

目前正在生成一个 PNG,但它只有 ScrollViewer 的当前可见部分。有什么方法可以让 PNG 包含所有内容,包括需要滚动到视图中的内容?

【问题讨论】:

    标签: c# wpf image


    【解决方案1】:

    将此与滚动查看器的 CONTENT 一起用作源,而不是滚动查看器本身: (即使内容不可见也会拍摄快照)

        public static void SnapShotPNG(this UIElement source, Uri destination, int zoom)
        {
            try
            {
                double actualHeight = source.RenderSize.Height;
                double actualWidth = source.RenderSize.Width;
    
                double renderHeight = actualHeight * zoom;
                double renderWidth = actualWidth * zoom;
    
                RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)renderWidth, (int)renderHeight, 96, 96, PixelFormats.Pbgra32);
                VisualBrush sourceBrush = new VisualBrush(source);
    
                DrawingVisual drawingVisual = new DrawingVisual();
                DrawingContext drawingContext = drawingVisual.RenderOpen();
    
                using (drawingContext)
                {
                    drawingContext.PushTransform(new ScaleTransform(zoom, zoom));
                    drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight)));
                }
                renderTarget.Render(drawingVisual);
    
                PngBitmapEncoder encoder = new PngBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(renderTarget));
                using (FileStream stream = new FileStream(destination.LocalPath, FileMode.Create, FileAccess.Write))
                {
                    encoder.Save(stream);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e);
            }
        }
    

    【讨论】:

    • 完美地工作,当我想出缩放。为此+1!
    【解决方案2】:

    这里我有将画布导出为图像的代码。我认为,如果您从 Canvas 更改为 ScrollViewer,它也适用于 ScrollViewer。使用此代码,您还可以保存所有视图。

        public static void ExportToImage(Canvas canvas)
        {
    
    
            dlg.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif";
            dlg.DefaultExt = "png";
            dlg.FilterIndex = 2;
            dlg.FileName = "DesignerImage.png";
            dlg.RestoreDirectory = true;
    
            // Display OpenFileDialog by calling ShowDialog method 
            Nullable<bool> result = dlg.ShowDialog();
            string path = dlg.FileName;
            int selectedFilterIndex = dlg.FilterIndex;
    
            if(result==true)
            {
    
                try
                {
                    RenderTargetBitmap renderBitmap = new RenderTargetBitmap(
                             (int)canvas.ActualWidth, (int)canvas.ActualHeight,
                              96d, 96d, PixelFormats.Pbgra32);
                    // needed otherwise the image output is black
                    canvas.Measure(new Size((int)canvas.ActualWidth, (int)canvas.ActualHeight));
                    canvas.Arrange(new Rect(new Size((int)canvas.ActualWidth, (int)canvas.ActualHeight)));
    
                    renderBitmap.Render(canvas);
                    BitmapEncoder imageEncoder = new PngBitmapEncoder();
    
    
                    if (selectedFilterIndex == 0)
                    {
    
                    }
                    else if (selectedFilterIndex == 1)
                    {
                        imageEncoder = new JpegBitmapEncoder();
                    }
                    else if (selectedFilterIndex == 2)
                    {
                        imageEncoder = new PngBitmapEncoder();
                    }
                    else if (selectedFilterIndex == 3)
                    {
                        imageEncoder = new JpegBitmapEncoder();
                    }
                    else if (selectedFilterIndex == 4)
                    {
                        imageEncoder = new GifBitmapEncoder();
                    }
    
    
                    imageEncoder.Frames.Add(BitmapFrame.Create(renderBitmap));
    
    
    
    
                    using (FileStream file = File.Create(path))
                    {
                        imageEncoder.Save(file);
    
                    }
    
    
    
                }
                catch (Exception ex)
                {
    
                }
    
         }
    
    
        }
    

    【讨论】:

      猜你喜欢
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 2011-12-16
      • 2018-07-01
      • 2015-11-02
      • 2011-04-06
      相关资源
      最近更新 更多