Tengo un problema con SaveFIleDialog, seguí algunos pasos de stackoverflow. El problema es cuando no uso SaveFileDialog pero esto:

 private void SaveImage(Canvas canvas, string fileName)
    {
        RenderTargetBitmap renderBitmap = new RenderTargetBitmap(4646, 3890, 1500d, 1500d, PixelFormats.Pbgra32);

        canvas.Measure(new Size((int)canvas.Width, (int)canvas.Height));
        canvas.Arrange(new Rect(new Size((int)canvas.Width, (int)canvas.Height)));

        renderBitmap.Render(canvas);



        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(renderBitmap));

        using (FileStream file = File.Create(fileName))
        {
            encoder.Save(file);
        }
    }

Y llámalo en el evento del botón Guardar, funciona. pero cuando lo uso así:

 private void SaveImage(Canvas canvas, string fileName)
    {
        RenderTargetBitmap renderBitmap = new RenderTargetBitmap(4646, 3890, 1500d, 1500d, PixelFormats.Pbgra32);

        canvas.Measure(new Size((int)canvas.Width, (int)canvas.Height));
        canvas.Arrange(new Rect(new Size((int)canvas.Width, (int)canvas.Height)));

        renderBitmap.Render(canvas);

        SaveFileDialog s = new SaveFileDialog();
        s.FileName = "Pic";
        s.DefaultExt = ".png";
        s.Filter = "Picture files (.png)|*.png";

        Nullable<bool> result = s.ShowDialog();
        if (result == true)
        {
            string filename = s.FileName;

        }
    }

No guarda el archivo en absoluto. ¿Algún consejo? ¿Qué estoy haciendo mal?

-2
AlexDev 11 ene. 2017 a las 19:02
¿ No guarda porque no hay encoder.Save(file);? - pase el nombre seleccionado del cuadro de diálogo a la secuencia de archivos como lo hace en el primer ejemplo. El cuadro de diálogo solo le proporciona una cadena de nombre de archivo seleccionada por el usuario, no escribe / no puede escribir nada en el disco.
 – 
Alex K.
11 ene. 2017 a las 19:05

1 respuesta

La mejor respuesta

Aún debe guardar el mapa de bits en un archivo. La única diferencia es que debe usar la propiedad FileName de SaveFileDialog como argumento de constructor de FileStream:

private void SaveImage(Canvas canvas, string fileName)
{
    SaveFileDialog s = new SaveFileDialog();
    s.FileName = "Pic";
    s.DefaultExt = ".png";
    s.Filter = "Picture files (.png)|*.png";

    Nullable<bool> result = s.ShowDialog();
    if (result == true)
    {
        RenderTargetBitmap renderBitmap = new RenderTargetBitmap(4646, 3890, 1500d, 1500d, PixelFormats.Pbgra32);

        canvas.Measure(new Size((int)canvas.Width, (int)canvas.Height));
        canvas.Arrange(new Rect(new Size((int)canvas.Width, (int)canvas.Height)));

        renderBitmap.Render(canvas);

        string filename = s.FileName;
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(renderBitmap));

        using (FileStream file = File.Create(filename))
        {
            encoder.Save(file);
        }
    }
}
2
mm8 11 ene. 2017 a las 19:08