VintaSoft Imaging .NET SDK 15.2: Документация для .NET разработчика
В этом разделе
Как запустить анимацию в WPF просмотрщике изображений?
В этом разделе
WpfImageViewer может отображать анимацию, основанную на коллекции изображений. Коллекция изображений может храниться в WpfImageViewer или отдельно.


Если изображения загружены в просмотрщик изображений и вам необходимо анимировать изображения в просмотрщике изображений, вам необходимо изменять кадр анимации с помощью метода WpfImageViewer.SetFocusedIndexSync.

Вот C#/VB.NET код, который демонстрирует, как запустить анимацию в WpfImageViewer, если изображения загружены в просмотрщик изображений:
/// <summary>
/// Starts showing animation in image viewer.
/// </summary>
/// <param name="viewer">An image viewer.</param>
/// <param name="delay">The animation delay in milliseconds.</param>
private void StartAnimation(Vintasoft.Imaging.Wpf.UI.WpfImageViewer viewer, int delay)
{
    // start animation
    System.Threading.ThreadPool.QueueUserWorkItem(
        new System.Threading.WaitCallback(ShowAnimation), new object[] { viewer, delay });
}

/// <summary>
/// Shows animation in image viewer.
/// </summary>
/// <param name="state">Data that the method uses.</param>
private void ShowAnimation(object state)
{
    // get data
    object[] data = (object[])state;
    // get image viewer
    Vintasoft.Imaging.Wpf.UI.WpfImageViewer viewer =
         (Vintasoft.Imaging.Wpf.UI.WpfImageViewer)data[0];
    // get delay value
    int delay = (int)data[1];
    // for each image in image collection of image viewer
    for (int i = 0; i < viewer.Images.Count; i++)
    {
        // change image in image viewer
        viewer.SetFocusedIndexSync(i);
        // sleep for a while
        System.Threading.Thread.Sleep(delay);
    }
}
''' <summary>
''' Starts showing animation in image viewer.
''' </summary>
''' <param name="viewer">An image viewer.</param>
''' <param name="delay">The animation delay in milliseconds.</param>
Private Sub StartAnimation(viewer As Vintasoft.Imaging.Wpf.UI.WpfImageViewer, delay As Integer)
    ' start animation
    System.Threading.ThreadPool.QueueUserWorkItem(New System.Threading.WaitCallback(AddressOf ShowAnimation), New Object() {viewer, delay})
End Sub

''' <summary>
''' Shows animation in image viewer.
''' </summary>
''' <param name="state">Data that the method uses.</param>
Private Sub ShowAnimation(state As Object)
    ' get data
    Dim data As Object() = DirectCast(state, Object())
    ' get image viewer
    Dim viewer As Vintasoft.Imaging.Wpf.UI.WpfImageViewer = DirectCast(data(0), Vintasoft.Imaging.Wpf.UI.WpfImageViewer)
    ' get delay value
    Dim delay As Integer = CInt(data(1))
    ' for each image in image collection of image viewer
    For i As Integer = 0 To viewer.Images.Count - 1
        ' change image in image viewer
        viewer.SetFocusedIndexSync(i)
        ' sleep for a while
        System.Threading.Thread.Sleep(delay)
    Next
End Sub



Если изображения хранятся отдельно от просмотрщика изображений и вам необходимо анимировать изображения, вам необходимо изменить кадр анимации с помощью свойства WpfImageViewer.Image.

Вот C#/VB.NET код, который демонстрирует, как захватывать изображения с камеры и отображать захваченные изображения в WpfImageViewer:
/// <summary>
/// Image capture source.
/// </summary>
Vintasoft.Imaging.Media.ImageCaptureSource _imageCaptureSource;



/// <summary>
/// Initializes a new instance of the <see cref="MainWindow"/> class.
/// </summary>
public MainWindow()
{
    InitializeComponent();

    // get available image capture devices
    System.Collections.ObjectModel.ReadOnlyCollection<Vintasoft.Imaging.Media.ImageCaptureDevice> availableDevices =
        Vintasoft.Imaging.Media.ImageCaptureDeviceConfiguration.GetCaptureDevices();

    // create new image capture source
    _imageCaptureSource = new Vintasoft.Imaging.Media.ImageCaptureSource();
    _imageCaptureSource.CaptureCompleted +=
        new System.EventHandler<Vintasoft.Imaging.Media.ImageCaptureCompletedEventArgs>(ImageCaptureSource_CaptureCompleted);

    // if there are available devices
    if (availableDevices.Count != 0)
    {
        // use the first image capture device
        _imageCaptureSource.CaptureDevice = availableDevices[0];
    }

    Loaded += new System.Windows.RoutedEventHandler(MainWindow_Loaded);
    Closed += new System.EventHandler(MainWindow_Closed);
}



/// <summary>
/// Starts capturing from camera.
/// </summary>
private void MainWindow_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
    // if capture device is empty
    if (_imageCaptureSource.CaptureDevice != null)
    {
        // start the image capture source
        _imageCaptureSource.Start();
        // initialize new image capture request
        _imageCaptureSource.CaptureAsync();
    }
}

/// <summary>
/// Image is captured.
/// </summary>
private void ImageCaptureSource_CaptureCompleted(object sender, Vintasoft.Imaging.Media.ImageCaptureCompletedEventArgs e)
{
    // save reference to the previously captured image
    Vintasoft.Imaging.VintasoftImage oldImage = wpfImageViewer1.Image;

    // get captured image and show captured image in the image viewer
    wpfImageViewer1.Image = e.GetCapturedImage();

    // if previously captured image exists
    if (oldImage != null)
    {
        // dispose previously captured image
        oldImage.Dispose();
    }

    // if capture source is started
    if (_imageCaptureSource.State == Vintasoft.Imaging.Media.ImageCaptureState.Started)
    {
        // initialize new image capture request
        _imageCaptureSource.CaptureAsync();
    }
}

/// <summary>
/// Form is closed.
/// </summary>
private void MainWindow_Closed(object sender, System.EventArgs e)
{
    // stop the image capture source
    _imageCaptureSource.Stop();
}
''' <summary>
''' Image capture source.
''' </summary>
Private _imageCaptureSource As Vintasoft.Imaging.Media.ImageCaptureSource



''' <summary>
''' Initializes a new instance of the <see cref="MainWindow"/> class.
''' </summary>
Public Sub New()
    InitializeComponent()

    ' get available image capture devices
    Dim availableDevices As System.Collections.ObjectModel.ReadOnlyCollection(Of Vintasoft.Imaging.Media.ImageCaptureDevice) = Vintasoft.Imaging.Media.ImageCaptureDeviceConfiguration.GetCaptureDevices()

    ' create new image capture source
    _imageCaptureSource = New Vintasoft.Imaging.Media.ImageCaptureSource()
    AddHandler _imageCaptureSource.CaptureCompleted, New System.EventHandler(Of Vintasoft.Imaging.Media.ImageCaptureCompletedEventArgs)(AddressOf ImageCaptureSource_CaptureCompleted)

    ' if there are available devices
    If availableDevices.Count <> 0 Then
        ' use the first image capture device
        _imageCaptureSource.CaptureDevice = availableDevices(0)
    End If

    AddHandler Loaded, New System.Windows.RoutedEventHandler(AddressOf MainWindow_Loaded)
    AddHandler Closed, New System.EventHandler(AddressOf MainWindow_Closed)
End Sub



''' <summary>
''' Starts capturing from camera.
''' </summary>
Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs)
    ' if capture device is empty
    If _imageCaptureSource.CaptureDevice IsNot Nothing Then
        ' start the image capture source
        _imageCaptureSource.Start()
        ' initialize new image capture request
        _imageCaptureSource.CaptureAsync()
    End If
End Sub

''' <summary>
''' Image is captured.
''' </summary>
Private Sub ImageCaptureSource_CaptureCompleted(sender As Object, e As Vintasoft.Imaging.Media.ImageCaptureCompletedEventArgs)
    ' save reference to the previously captured image
    Dim oldImage As Vintasoft.Imaging.VintasoftImage = wpfImageViewer1.Image

    ' get captured image and show captured image in the image viewer
    wpfImageViewer1.Image = e.GetCapturedImage()

    ' if previously captured image exists
    If oldImage IsNot Nothing Then
        ' dispose previously captured image
        oldImage.Dispose()
    End If

    ' if capture source is started
    If _imageCaptureSource.State = Vintasoft.Imaging.Media.ImageCaptureState.Started Then
        ' initialize new image capture request
        _imageCaptureSource.CaptureAsync()
    End If
End Sub

''' <summary>
''' Form is closed.
''' </summary>
Private Sub MainWindow_Closed(sender As Object, e As System.EventArgs)
    ' stop the image capture source
    _imageCaptureSource.[Stop]()
End Sub



Кроме того, вы можете использовать WpfAnimatedImageViewer чтобы показать анимацию.

Вот C#/VB.NET код, который демонстрирует, как отображать анимацию из GIF файла в WpfAnimatedImageViewer:
/// <summary>
/// Shows animation in animated image viewer.
/// </summary>
/// <param name="viewer">An animated image viewer.</param>
/// <param name="filename">The filename.</param>
private void StartAnimation(Vintasoft.Imaging.Wpf.UI.WpfAnimatedImageViewer viewer, string filename)
{
    // if image collection of the image viewer is not empty
    if (viewer.Images.Count > 0)
    {
        // clear the image collection of the image viewer
        viewer.Images.ClearAndDisposeItems();
    }
    // open the file
    viewer.Images.Add(filename);
    // start the animation
    viewer.Animation = true;
}
''' <summary>
''' Shows animation in animated image viewer.
''' </summary>
''' <param name="viewer">An animated image viewer.</param>
''' <param name="filename">The filename.</param>
Private Sub StartAnimation(viewer As Vintasoft.Imaging.Wpf.UI.WpfAnimatedImageViewer, filename As String)
    ' if image collection of the image viewer is not empty
    If viewer.Images.Count > 0 Then
        ' clear the image collection of the image viewer
        viewer.Images.ClearAndDisposeItems()
    End If
    ' open the file
    viewer.Images.Add(filename)
    ' start the animation
    viewer.Animation = True
End Sub