日期:2014-05-17  浏览次数:20732 次

新时尚Windows8开发(29):多媒体捕捉(高级篇)

这今说的这个所谓高级篇,是相对而言的,就是比上一节说的内容稍稍灵活了一些,不过我想我们在做应用的时候,也很少这么高级去搞,你要说专业的拍摄程序,那压根用不着你做,人家设备提供商就已经开发了,就像我买的Dell的产品,人家就已经提供了一个很强大的拍摄程序了。

 

不过呢,了解一下,研究一下还是有意义的。这个“高级”内容便是和MediaCapture类有关,主要就是它,你看它的人生阅历不浅,N多个方法,当然,这些方法我们总的来说就可能用到三个,即预览的,拍照片的,录制视频的,是啊你想摄像就这几个用途而已。可能有人说,那视频聊天呢?视频聊天不就动态录制视频呗。

 

所以,很多事情,我们不必须弄得太复杂,就像今天这例子一样,很简单,不过也许是可以说明其应用价值的。

那么,我们今天玩什么呢?弄一个定时拍摄好不?这还有点意思的。

 

1、新建项目,不会的回家复习。

2、XAML页面不用多东西,既然要拍东西,那得能够预览摄像头中的内容,这样方便拍摄,所以,先弄一个CaptureElement,这是专门在UI上显晃摄像头预览用的;另外,我们要显示定时拍到的照片,所以,要一个ListView控件;要进行相关操作,需要扔几个按钮。

<Page
    x:Class="App1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <CaptureElement x:Name="ce" Grid.Row="0" Margin="13"/>
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="auto"/>
            </Grid.ColumnDefinitions>
            <ListView x:Name="lv" Grid.Column="0" Margin="3,2,3,3" SelectionMode="None" Height="150">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <Image Width="120" Height="120" Stretch="Uniform" Source="{Binding}"/>
                    </DataTemplate>
                </ListView.ItemTemplate>
                <ListView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </ListView.ItemsPanel>
            </ListView>
            <StackPanel Grid.Column="1" Margin="10">
                <Button Content="开始" Click="onStart" x:Name="btnStart"/>
                <Button Content="停止" Click="onStop" x:Name="btnStop" IsEnabled="False"/>
            </StackPanel>
        </Grid>
    </Grid>
</Page>


3、要定时拍摄,自然要有个计时器,这个有,在Windows.System.Threading命名空间下,其名曰:ThreadPoolTimer,我们将用它来计时。

先引入以下命名空间:

using Windows.System.Threading;
using System.Collections.ObjectModel;
using Windows.UI.Xaml.Media.Imaging;
using Windows.Media.Capture;
using Windows.Media.MediaProperties;
using Windows.Storage.Streams;


在MainPage类中定义以下成员:

    public sealed partial class MainPage : Page
    {
        ObservableCollection<BitmapImage> images = null;
        MediaCapture myCapture = null;
        ThreadPoolTimer myTimer = null;


在MainPage的构造函数里面帮它们化妆一下。

        public  MainPage()
        {
            this.InitializeComponent();
            this.myCapture = new MediaCapture();
            this.images = new ObservableCollection<BitmapImage>();
            this.lv.ItemsSource = images;
        }


我们希望在导航到页面时就开启摄像头并开始预览,所以,在OnNavigatedTo方法中要做点手脚。

        protected override async vo