Home > Software engineering >  saving a picture of a specific area taken as a screenshot to the desired path
saving a picture of a specific area taken as a screenshot to the desired path

Time:12-10

with the code I gave, I can take a screenshot of the section where the canvas is located. However, I am able to get on the predetermined path. What I want to do is I want to save the image to the section I want via savefiledialog. How can I do that.

 private void btnKaydet_Click(object sender, RoutedEventArgs e)
    {
        UIElement element = cnvs as UIElement;
        Uri path = new Uri(@"c:\screenshot.png");
        CaptureScreen(element, path);   
    }

public void CaptureScreen(UIElement source, Uri destination)
    {
        try
        {
            double Height, renderHeight, Width, renderWidth;

            Height = renderHeight = source.RenderSize.Height;
            Width = renderWidth = source.RenderSize.Width;

            //Specification for target bitmap like width/height pixel etc.
            RenderTargetBitmap renderTarget = new
            RenderTargetBitmap((int)renderWidth, (int)renderHeight, 96, 96,
            PixelFormats.Pbgra32);
            //creates Visual Brush of UIElement
            VisualBrush visualBrush = new VisualBrush(source);

            DrawingVisual drawingVisual = new DrawingVisual();
            using (DrawingContext drawingContext =
            drawingVisual.RenderOpen())
            {
                //draws image of element
                drawingContext.DrawRectangle(visualBrush, null, new
                Rect(new System.Windows.Point(0, 0), new System.Windows.Point(Width, Height)));
            }
            //renders image
            renderTarget.Render(drawingVisual);

            //PNG encoder for creating PNG file
            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.ToString());
        }
    }

CodePudding user response:

We can use the FileSaveDialog class.

In your using statement place

using Microsoft.Win32;
using System.Windows;

You may have to add a reference to System.Windows.Forms

A popular WPF open source dialog library can be found here as well if you opt not use the Microsoft version. https://github.com/ookii-dialogs/ookii-dialogs-wpf

  private void BtnKaydet_OnClick(object sender, RoutedEventArgs e)
    {
        SaveFileDialog saveFileDialog = new SaveFileDialog();
        if (saveFileDialog.ShowDialog() == true)
        {
            UIElement element = this.cnvs as UIElement;
            Uri path = new Uri(saveFileDialog.FileName);
            CaptureScreen(element, path);
        }
    }
 public void CaptureScreen(UIElement source, Uri destination)
    {
        try
        {
            double Height, renderHeight, Width, renderWidth;
            Height = renderHeight = source.RenderSize.Height;
            Width = renderWidth = source.RenderSize.Width;

            //Specification for target bitmap like width/height pixel etc.
            RenderTargetBitmap renderTarget =
                new RenderTargetBitmap((int)renderWidth, (int)renderHeight, 96, 96, PixelFormats.Pbgra32);
            //creates Visual Brush of UIElement
            VisualBrush visualBrush = new VisualBrush(source);
            DrawingVisual drawingVisual = new DrawingVisual();
            using (DrawingContext drawingContext = drawingVisual.RenderOpen())
            {
                //draws image of element
                drawingContext.DrawRectangle(visualBrush, null,
                    new Rect(new System.Windows.Point(0, 0), new System.Windows.Point(Width, Height)));
            }

            //renders image
            renderTarget.Render(drawingVisual);

            //PNG encoder for creating PNG file
            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.ToString());
        }
    }

You can also specify allowed file extension types(.png,.jpg etc.) with the filter parameters. https://wpf-tutorial.com/dialogs/the-savefiledialog/

  • Related