Сохранение результирующего изображения с эффектом растрового изображения WPF - PullRequest
1 голос
/ 10 декабря 2010

У меня есть изображение, которое будет отображаться на странице, а затем применить к изображению некоторые визуальные эффекты. например, эффект скоса. После успешного применения эффекта можно ли сохранить результирующее изображение?

1 Ответ

5 голосов
/ 10 декабря 2010

вы можете сделать что-то вроде этого

private void SaveImage()
    {
        try
        {

            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.Filter = "JPeg Image(*.JPG)|*.jpg|Bitmap Image(*.BMP)|*.bmp|Png Image(*.PNG)|*.png|Gif Image(*.GIF)|*.gif";

            if (saveDialog.ShowDialog().Value == true)
            {
                // Save current canvas transform
                Transform transform = img.LayoutTransform;
                // reset current transform (in case it is scaled or rotated)
                img.LayoutTransform = null;

                // Get the size of canvas
                Size size = new Size(img.ActualWidth, img.ActualHeight);
                // Measure and arrange the surface
                // VERY IMPORTANT
                img.Measure(size);
                img.Arrange(new Rect(size));

                // Create a render bitmap and push the surface to it
                RenderTargetBitmap renderBitmap =
                  new RenderTargetBitmap(
                    (int)size.Width,
                    (int)size.Height,
                    96d,
                    96d,
                    PixelFormats.Default);
                renderBitmap.Render(img);
                BitmapEncoder encoder = new BmpBitmapEncoder();
                string extension = saveDialog.FileName.Substring(saveDialog.FileName.LastIndexOf('.'));
                switch (extension.ToLower())
                {
                    case ".jpg":
                        encoder = new JpegBitmapEncoder();
                        break;
                    case ".bmp":
                        encoder = new BmpBitmapEncoder();
                        break;
                    case ".gif":
                        encoder = new GifBitmapEncoder();
                        break;
                    case ".png":
                        encoder = new PngBitmapEncoder();
                        break;
                }
                // push the rendered bitmap to it
                encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
                // Create a file stream for saving image
                using (FileStream fs = File.Open(saveDialog.FileName, FileMode.OpenOrCreate))
                {
                    encoder.Save(fs);
                }
                // Restore previously saved layout
                img.LayoutTransform = transform;
            }

        }
        catch (Exception)
        {

            throw;
        }
    }
...