Захват снимка экрана из элемента списка воспроизведения в WPF
Автор: Диптимайя Патра (Diptimaya Patra)
В предыдущей статье, посвященной элементам списка воспроизведения в WPF, мы обсуждали некоторые основные функциональные возможности. В этой статье будет показано, как можно получить снимок экрана из воспроизводимого файла мультимедиа (видеофайла)
.
Создание проекта приложения WPF
Запустите Visual Studio 2008, создайте приложение WPF и дайте проекту имя MediaSampleWPF.
.gif)
Я просто расширяю функцию, с которой мы работали в нашем последнем приложении с названием "Элементы списка воспроизведения в WPF".
Мы добавим другую кнопку для получения снимка экрана. См. следующий рисунок.
.gif)
Теперь добавим метод расширения, который поможет нам захватить этот снимок экрана.
Создадим статический класс и добавим в него следующий метод.
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
Теперь наше приложение готово для работы. Запустим его.
.gif)
При захвате снимка экрана он сохраняется в каталог выходных данных (в папку Bin проекта).
.gif)
Можно также загрузить демонстрационный проект, который использовался в данном примере.
Надеюсь, эта статья будет полезной.