本demo实现两个目的:1. 图片的循环播放; 2. 生成 gif 动图;
思路:循环播放采用计时器;生成 gif 采用官方的函数,貌似只播放一次,不能循环播放。
- xaml代码
<Window x:Class="GifSave.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:GifSave"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Border Name="border">
<Image Name="image" Stretch="Uniform"/>
</Border>
<StackPanel Grid.Row="1" Orientation="Horizontal">
<Button Name="btnStart" Content="Start" Margin="5" Click="Button_Click"/>
<Button Name="btnPause" Content="Pause" Margin="5" Click="Button_Click"/>
<Button Name="btnSave" Content="Save as gif" Margin="5" Click="Button_Click"/>
</StackPanel>
</Grid>
</Window>
- 后台代码
using System;
using System.IO;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
namespace GifSave
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
private bool isShowing = false;
private int numberOfImage = 1;
public MainWindow()
{
InitializeComponent();
}
private void ChangeImageSource(object sender, EventArgs e)
{
if (!isShowing)
{
return;
}
Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(ThreadStart)delegate ()
{
image.Source = new BitmapImage(new Uri(@"C:\Users\Administrator\Desktop\鱼\" + numberOfImage + ".jpg"));
numberOfImage = numberOfImage % 17 + 1;
}
);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if ((sender as Button).Name.ToString() == "btnStart")
{
isShowing = true;
DispatcherTimer dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(ChangeImageSource);
dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 250);
dispatcherTimer.Start();
}
else if ((sender as Button).Name.ToString() == "btnPause")
{
isShowing = false;
}
else if ((sender as Button).Name.ToString() == "btnSave")
{
using (FileStream stream = new FileStream(@"C:\Users\Administrator\Desktop\鱼\fish.gif", FileMode.Create))
{
GifBitmapEncoder encoder = new GifBitmapEncoder();
for (int i = 1; i <= 17; i++)
{
encoder.Frames.Add(BitmapFrame.Create(new Uri(@"C:\Users\Administrator\Desktop\鱼\" + (i % 17 + 1) + ".jpg")));
}
encoder.Save(stream);
}
}
}
}
}