尽管使用BitmapImage等类型可以对图像文件进行解码,但是,如果图像文件包含多个帧(如Gif图像一般包含多个帧),或者需要对图像进行修改后并保存为新的文件,那么BitmapImage类是无法胜任的。因此在实际开发中,是需要用到图像的编码与解码技术的。
1. 图像解码
对图像文件进行解码需要使用BitmaDecoder类(位于Windows.Graphics.Imaging命名空间),该类包装了图像解码的一系列功能。
下面将用示例来演示如何对Gif图像文件进行解码,并显示Gif文件中各个帧的图像。
应用程序页面上的XAML代码如下:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Content="解码图像" Tapped="Button_Tapped"/>
<ListView x:Name="lvimgs" Grid.Row="1" Margin="1,6" ScrollViewer.HorizontalScrollMode="Disabled"
ScrollViewer.VerticalScrollMode="Auto">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsWrapGrid Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
<Image MaxWidth="100" MaxHeight="100" Stretch="Uniform" Source="{Binding}"/>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Margin" Value="12"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
</Grid>
然后向应用程序项目中添加一个Gif图像文件,然后处理Button的Tapped事件处理程序,对Gif图像文件进行解码,并显示每一帧的图像。
private async void Button_Tapped(object sender, TappedRoutedEventArgs e)
{
Button btn = sender as Button;
btn.IsEnabled = false;
//项目中的图像文件
Uri gifuri = new Uri("ms-appx:///Assets/sample.gif");
StorageFile gifFile = await StorageFile.GetFileFromApplicationUriAsync(gifuri);
using (IRandomAccessStream inputStream = await gifFile.OpenReadAsync())
{
//创建图像解码器实例
BitmapDecoder decoder = await BitmapD