Как я могу создать эскиз из окна WPF и преобразовать его в байты [], чтобы я мог сохранить его? - PullRequest
1 голос
/ 13 октября 2011

Я хотел бы создать Thumbnail из моего окна wpf и хотел бы сохранить его в базе данных и отобразить позже. Есть ли хорошее решение?

Я начал с RenderTargetBitmap, но не могу найти простой способ получить его в байтах.

RenderTargetBitmap bmp = new RenderTargetBitmap(180, 180, 96, 96, PixelFormats.Pbgra32);
bmp.Render(myWpfWindow);

Использование user32.dll и Graphics.CopyFromScreen () не подходит для меня и здесь , потому что я тоже хочу сделать скриншот из пользовательских элементов управления.

Спасибо

Ответы [ 2 ]

5 голосов
/ 15 октября 2011

Стивен Роббинс написал отличное сообщение в блоге о создании снимка экрана элемента управления, который содержит следующий метод расширения:

public static class Screenshot
{
    /// <summary>
    /// Gets a JPG "screenshot" of the current UIElement
    /// </summary>
    /// <param name="source">UIElement to screenshot</param>
    /// <param name="scale">Scale to render the screenshot</param>
    /// <param name="quality">JPG Quality</param>
    /// <returns>Byte array of JPG data</returns>
    public static byte[] GetJpgImage(this UIElement source, double scale, int quality)
    {
        double actualHeight = source.RenderSize.Height;
        double actualWidth = source.RenderSize.Width;

        double renderHeight = actualHeight * scale;
        double renderWidth = actualWidth * scale;

        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(scale, scale));
            drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight)));
        }
        renderTarget.Render(drawingVisual);

        JpegBitmapEncoder jpgEncoder = new JpegBitmapEncoder();
        jpgEncoder.QualityLevel = quality;
        jpgEncoder.Frames.Add(BitmapFrame.Create(renderTarget));

        Byte[] _imageArray;

        using (MemoryStream outputStream = new MemoryStream())
        {
            jpgEncoder.Save(outputStream);
            _imageArray = outputStream.ToArray();
        }

        return _imageArray;
    }
}

Этот метод использует элемент управления и масштабный коэффициенти возвращает байтовый массив.Так что это, кажется, вполне соответствует вашим требованиям.

Проверьте пост для дальнейшего чтения и пример проекта, который довольно аккуратный.

0 голосов
/ 13 октября 2011

Вы можете использовать BitmapEncoder для кодирования вашего растрового изображения в файл PNG, JPG или даже BMP.Обратитесь к документации MSDN по BitmapEncoder.Frames, в которой есть пример, который сохраняется в FileStream.Вы можете сохранить его в любом потоке.

Чтобы получить BitmapFrame из RenderTargetBitmap, просто создайте его, используя метод BitmapFrame.Create(BitmapSource).

...