Помогите сохранить изображение в файл с эффектом PixelShader - WPF - PullRequest
1 голос
/ 04 июня 2009

Я пытаюсь сохранить элемент управления wpf в файл, но я применяю к нему эффект PixelShader, и когда я пытаюсь сохранить, сохраненное изображение полностью белое, черное или красное ... зависит от параметров эффекта.

Я использую код здесь: WPF - Программная привязка для BitmapEffect

как мне правильно его сохранить?

спасибо!

UPDATE: код, который я использую:

        BitmapSource bitmap = preview.Source as BitmapImage;
        Rectangle r = new Rectangle();
        r.Fill = new ImageBrush(bitmap);
        r.Effect = effect;
        Size sz = new Size(bitmap.PixelWidth, bitmap.PixelHeight);
        r.Measure(sz);
        r.Arrange(new Rect(sz));
        var rtb = new RenderTargetBitmap(bitmap.PixelWidth, bitmap.PixelHeight, bitmap.DpiX, bitmap.DpiY, PixelFormats.Pbgra32);
        rtb.Render(r);

        PngBitmapEncoder png = new PngBitmapEncoder();
        png.Frames.Add(BitmapFrame.Create(rtb));

        Stream stm = File.Create("new.png");
        png.Save(stm);
        stm.Close();

1 Ответ

0 голосов
/ 04 июня 2009

Попробуйте этот кусок кода:

    /// <summary>
    /// Creates a screenshot of the given visual at the desired dots/inch (DPI).
    /// </summary>
    /// <param name="target">Visual component of which to capture as a screenshot.</param>
    /// <param name="dpiX">Resolution, in dots per inch, in the X axis. Typical value is 96.0</param>
    /// <param name="dpiY">Resolution, in dots per inch, in the Y axis. Typical value is 96.0</param>
    /// <returns>A BitmapSource of the given Visual at the requested DPI, or null if there was an error.</returns>       
    public static BitmapSource CaptureScreen(Visual target, double dpiX, double dpiY)
    {
        if (target == null)
        {
            return null;
        }

        RenderTargetBitmap rtb = null;

        try
        {
            // Get the actual size
            Rect bounds = VisualTreeHelper.GetDescendantBounds(target);
            rtb = new RenderTargetBitmap((int)(bounds.Width * dpiX / 96.0),
                                          (int)(bounds.Height * dpiY / 96.0),
                                          dpiX,
                                          dpiY,
                                          PixelFormats.Pbgra32);

            DrawingVisual dv = new DrawingVisual();
            using (DrawingContext ctx = dv.RenderOpen())
            {
                VisualBrush vb = new VisualBrush(target);
                ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
            }

            rtb.Render(dv);
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine("Error capturing image: " + ex.Message);
            return null;
        }

        return rtb;
    }
...