Поделиться через


Захват снимка экрана из элемента списка воспроизведения в WPF

Автор: Диптимайя Патра (Diptimaya Patra)

В предыдущей статье, посвященной элементам списка воспроизведения в WPF, мы обсуждали некоторые основные функциональные возможности. В этой статье будет показано, как можно получить снимок экрана из воспроизводимого файла мультимедиа (видеофайла)
.
Создание проекта приложения WPF

Запустите Visual Studio 2008, создайте приложение WPF и дайте проекту имя MediaSampleWPF.

Я просто расширяю функцию, с которой мы работали в нашем последнем приложении с названием "Элементы списка воспроизведения в WPF".

Мы добавим другую кнопку для получения снимка экрана. См. следующий рисунок.

Теперь добавим метод расширения, который поможет нам захватить этот снимок экрана.

Создадим статический класс и добавим в него следующий метод.

public static class ScreenShot

{

    public static byte[] GetScreenShot(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;

    }

}

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

#region Capture Screenshot
private void btnScreenShot_Click(object sender, RoutedEventArgs e)

{

    byte[] screenshot = MediaEL.GetScreenShot(1, 90);

    FileStream fileStream = new FileStream(@"Capture.jpg", FileMode.Create, FileAccess.ReadWrite);

    BinaryWriter binaryWriter = new BinaryWriter(fileStream);

    binaryWriter.Write(screenshot);
    binaryWriter.Close();

}

#endregion

Теперь наше приложение готово для работы. Запустим его.

При захвате снимка экрана он сохраняется в каталог выходных данных (в папку Bin проекта).

Можно также загрузить демонстрационный проект, который использовался в данном примере.

Надеюсь, эта статья будет полезной.