如何更改Windows Phone 8.1相机的亮度设置?

时间:2014-10-14 05:09:17

标签: c# xaml windows-runtime windows-phone-8.1

我正在尝试更改相机视频信号的亮度设置。下面的代码是.cs文件和XAML文件。

using System.Diagnostics;
using System.Threading.Tasks;
using Windows.Media.Capture;
using Windows.Media.MediaProperties;
using Capture.Common;
using Capture.Data;
using System;
using System.Globalization;
using Windows.ApplicationModel.Resources;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

// The Pivot Application template is documented at http://go.microsoft.com/fwlink/?LinkID=391641

namespace Capture
{
public sealed partial class PivotPage : Page
    {
    private const string FirstGroupName = "FirstGroup";
    private const string SecondGroupName = "SecondGroup";

    private readonly NavigationHelper navigationHelper;
    private readonly ObservableDictionary defaultViewModel = new ObservableDictionary();
    private readonly ResourceLoader resourceLoader = ResourceLoader.GetForCurrentView( "Resources" );

    PivotPage rootPage;

    private Windows.Media.Capture.MediaCapture m_mediaCaptureMgr;



    public PivotPage()
        {
        this.InitializeComponent();

        this.NavigationCacheMode = NavigationCacheMode.Required;

        this.navigationHelper = new NavigationHelper( this );
        this.navigationHelper.LoadState += this.NavigationHelper_LoadState;
        this.navigationHelper.SaveState += this.NavigationHelper_SaveState;

        rootPage = this;
        }

    /// <summary>
    /// Gets the <see cref="NavigationHelper"/> associated with this <see cref="Page"/>.
    /// </summary>
    public NavigationHelper NavigationHelper
        {
        get { return this.navigationHelper; }
        }

    /// <summary>
    /// Gets the view model for this <see cref="Page"/>.
    /// This can be changed to a strongly typed view model.
    /// </summary>
    public ObservableDictionary DefaultViewModel
        {
        get { return this.defaultViewModel; }
        }

    /// <summary>
    /// Populates the page with content passed during navigation. Any saved state is also
    /// provided when recreating a page from a prior session.
    /// </summary>
    /// <param name="sender">
    /// The source of the event; typically <see cref="NavigationHelper"/>.
    /// </param>
    /// <param name="e">Event data that provides both the navigation parameter passed to
    /// <see cref="Frame.Navigate(Type, Object)"/> when this page was initially requested and
    /// a dictionary of state preserved by this page during an earlier
    /// session. The state will be null the first time a page is visited.</param>
    private async void NavigationHelper_LoadState( object sender, LoadStateEventArgs e )
        {
        // TODO: Create an appropriate data model for your problem domain to replace the sample data
        var sampleDataGroup = await SampleDataSource.GetGroupAsync( "Group-1" );
        this.DefaultViewModel[ FirstGroupName ] = sampleDataGroup;
        }

    /// <summary>
    /// Preserves state associated with this page in case the application is suspended or the
    /// page is discarded from the navigation cache. Values must conform to the serialization
    /// requirements of <see cref="SuspensionManager.SessionState"/>.
    /// </summary>
    /// <param name="sender">The source of the event; typically <see cref="NavigationHelper"/>.</param>
    /// <param name="e">Event data that provides an empty dictionary to be populated with
    /// serializable state.</param>
    private void NavigationHelper_SaveState( object sender, SaveStateEventArgs e )
        {
        // TODO: Save the unique state of the page here.
        }

    /// <summary>
    /// Adds an item to the list when the app bar button is clicked.
    /// </summary>
    /// <summary>
    /// Invoked when an item within a section is clicked.
    /// </summary>
    private void ItemView_ItemClick( object sender, ItemClickEventArgs e )
        {
        // Navigate to the appropriate destination page, configuring the new page
        // by passing required information as a navigation parameter
        var itemId = ( (SampleDataItem)e.ClickedItem ).UniqueId;
        if ( !Frame.Navigate( typeof( ItemPage ), itemId ) )
            {
            throw new Exception( this.resourceLoader.GetString( "NavigationFailedExceptionMessage" ) );
            }
        }

    /// <summary>
    /// Loads the content for the second pivot item when it is scrolled into view.
    /// </summary>
    private async void SecondPivot_Loaded( object sender, RoutedEventArgs e )
        {
        var sampleDataGroup = await SampleDataSource.GetGroupAsync( "Group-2" );
        DefaultViewModel[ SecondGroupName ] = sampleDataGroup;
        }

    #region NavigationHelper registration

    /// <summary>
    /// The methods provided in this section are simply used to allow
    /// NavigationHelper to respond to the page's navigation methods.
    /// <para>
    /// Page specific logic should be placed in event handlers for the  
    /// <see cref="NavigationHelper.LoadState"/>
    /// and <see cref="NavigationHelper.SaveState"/>.
    /// The navigation parameter is available in the LoadState method 
    /// in addition to page state preserved during an earlier session.
    /// </para>
    /// </summary>
    /// <param name="e">Provides data for navigation methods and event
    /// handlers that cannot cancel the navigation request.</param>
    protected override void OnNavigatedTo( NavigationEventArgs e )
        {
        this.navigationHelper.OnNavigatedTo( e );
        }

    protected override void OnNavigatedFrom( NavigationEventArgs e )
        {
        navigationHelper.OnNavigatedFrom( e );
        }

    #endregion


    private async void StartAppBarButton_OnClick( object sender, RoutedEventArgs e )
        {
        await StartDevice();
        await StartPreview();
        }

    private void StopAppBarButton_OnClick( object sender, RoutedEventArgs e )
        {
        previewElement.Source = null;

        m_mediaCaptureMgr.RecordLimitationExceeded -= new Windows.Media.Capture.RecordLimitationExceededEventHandler( RecordLimitationExceeded );
        m_mediaCaptureMgr.Failed -= new Windows.Media.Capture.MediaCaptureFailedEventHandler( Failed );

        m_mediaCaptureMgr.Dispose();
        m_mediaCaptureMgr = null;
        }

    private void EnumerateVideoProperties( MediaStreamType mediaStreamType )
        {
        var res = m_mediaCaptureMgr.VideoDeviceController.GetAvailableMediaStreamProperties( mediaStreamType );
        if ( res.Count > 1 )
            {
            for ( int i = 0 ; i < res.Count ; i++ )
                {
                var vp = (VideoEncodingProperties)res[ i ];
                Debug.WriteLine( "{0}    Type: {1}    [W x H]: {2} x {3}", i + 1, vp.Subtype, vp.Width, vp.Height );
                }
            }
        }

    private async Task StartDevice()
        {
        try
            {
            ShowStatusMessage( "Starting device" );
            m_mediaCaptureMgr = new Windows.Media.Capture.MediaCapture();
            await m_mediaCaptureMgr.InitializeAsync();

            if ( m_mediaCaptureMgr.MediaCaptureSettings.VideoDeviceId != "" && m_mediaCaptureMgr.MediaCaptureSettings.AudioDeviceId != "" )
                {
                ShowStatusMessage( "Device initialized successful" );

                m_mediaCaptureMgr.RecordLimitationExceeded += new Windows.Media.Capture.RecordLimitationExceededEventHandler( RecordLimitationExceeded );
                m_mediaCaptureMgr.Failed += new Windows.Media.Capture.MediaCaptureFailedEventHandler( Failed );
                }
            else
                {
                ShowStatusMessage( "No VideoDevice/AudioDevice Found" );
                }
            }
        catch ( Exception exception )
            {
            ShowExceptionMessage( exception );
            }
        }

    public async void RecordLimitationExceeded( Windows.Media.Capture.MediaCapture currentCaptureObject )
        {
        await Dispatcher.RunAsync( Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
        {
            try
                {
                ShowStatusMessage( "Stopping Record on exceeding max record duration" );
                await m_mediaCaptureMgr.StopRecordAsync();
                ShowStatusMessage( "Stopped record on exceeding max record duration:" );

                if ( !m_mediaCaptureMgr.MediaCaptureSettings.ConcurrentRecordAndPhotoSupported )
                    {
                    //if camera does not support record and Takephoto at the same time
                    //enable TakePhoto button again, after record finished
                    }
                }
            catch ( Exception e )
                {
                ShowExceptionMessage( e );
                }
        } );
        }

    public async void Failed( Windows.Media.Capture.MediaCapture currentCaptureObject, MediaCaptureFailedEventArgs currentFailure )
        {
        try
            {
            await Dispatcher.RunAsync( Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                ShowStatusMessage( "Fatal error" + currentFailure.Message );
            } );
            }
        catch ( Exception e )
            {
            ShowExceptionMessage( e );
            }
        }

    private async Task StartPreview()
        {
        try
            {
            ShowStatusMessage( "Starting preview" );

            previewCanvas.Visibility = Windows.UI.Xaml.Visibility.Visible;
            previewElement.Source = m_mediaCaptureMgr;
            await m_mediaCaptureMgr.StartPreviewAsync();

            if ( ( m_mediaCaptureMgr.VideoDeviceController.Brightness != null ) && m_mediaCaptureMgr.VideoDeviceController.Brightness.Capabilities.Supported )
                {
                SetupVideoDeviceControl( m_mediaCaptureMgr.VideoDeviceController.Brightness, sldBrightness );
                }
            if ( ( m_mediaCaptureMgr.VideoDeviceController.Contrast != null ) && m_mediaCaptureMgr.VideoDeviceController.Contrast.Capabilities.Supported )
                {
                SetupVideoDeviceControl( m_mediaCaptureMgr.VideoDeviceController.Contrast, sldContrast );
                }

            ShowStatusMessage( "Start preview successful" );

            }
        catch ( Exception exception )
            {
            previewElement.Source = null;
            ShowExceptionMessage( exception );
            }
        }

    private void SetupVideoDeviceControl( Windows.Media.Devices.MediaDeviceControl videoDeviceControl, Slider slider )
        {
        try
            {
            if ( ( videoDeviceControl.Capabilities ).Supported )
                {
                slider.IsEnabled = true;
                slider.Maximum = videoDeviceControl.Capabilities.Max;
                slider.Minimum = videoDeviceControl.Capabilities.Min;
                slider.StepFrequency = videoDeviceControl.Capabilities.Step;
                double controlValue = 0;
                if ( videoDeviceControl.TryGetValue( out controlValue ) )
                    {
                    slider.Value = controlValue;
                    }
                }
            else
                {
                slider.IsEnabled = false;
                }
            }
        catch ( Exception e )
            {
            ShowExceptionMessage( e );
            }
        }

    // VideoDeviceControllers
    internal void sldBrightness_ValueChanged( Object sender, Windows.UI.Xaml.Controls.Primitives.RangeBaseValueChangedEventArgs e )
        {
        try
            {
            bool succeeded = m_mediaCaptureMgr.VideoDeviceController.Brightness.TrySetValue( sldBrightness.Value );
            if ( !succeeded )
                {
                ShowStatusMessage( "Set Brightness failed" );
                }
            else
                {
                var msg = "Set Brightness: " + sldBrightness.Value;
                ShowStatusMessage( msg );
                Debug.WriteLine( msg );
                }
            }
        catch ( Exception exception )
            {
            ShowExceptionMessage( exception );
            }
        }

    internal void sldContrast_ValueChanged( Object sender, Windows.UI.Xaml.Controls.Primitives.RangeBaseValueChangedEventArgs e )
        {
        try
            {
            bool succeeded = m_mediaCaptureMgr.VideoDeviceController.Contrast.TrySetValue( sldContrast.Value );
            if ( !succeeded )
                {
                ShowStatusMessage( "Set Contrast failed" );
                }
            else
                {
                var msg = "Set Contrast: " + sldContrast.Value;
                ShowStatusMessage( msg );
                Debug.WriteLine( msg );
                }
            }
        catch ( Exception exception )
            {
            ShowExceptionMessage( exception );
            }
        }

    private void ShowStatusMessage( String text )
        {
        StatusBlock.Text = text;
        }

    private void ShowExceptionMessage( Exception ex )
        {
        StatusBlock.Text = "Exception";
        }
    }

public enum NotifyType
    {
    StatusMessage,
    ErrorMessage
    };
}

和XAML代码:

  <Page x:Class="Capture.PivotPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:Capture"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:data="using:Capture.Data"
  mc:Ignorable="d"
  DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"
  Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Page.Transitions>
    <TransitionCollection>
        <NavigationThemeTransition>
            <NavigationThemeTransition.DefaultNavigationTransitionInfo>
                <CommonNavigationTransitionInfo IsStaggeringEnabled="True" />
            </NavigationThemeTransition.DefaultNavigationTransitionInfo>
        </NavigationThemeTransition>
    </TransitionCollection>
</Page.Transitions>

<Grid>
    <Pivot x:Uid="Pivot"
           Title="MY APPLICATION"
           x:Name="pivot"
           CommonNavigationTransitionInfo.IsStaggerElement="True">

        <!--Pivot item one-->
        <PivotItem x:Uid="PivotItem1"
                   Margin="19,14.5,0,0"
                   Header="first"
                   DataContext="{Binding FirstGroup}"
                   d:DataContext="{Binding Groups[0], Source={d:DesignData Source=/DataModel/SampleData.json, Type=data:SampleDataSource}}"
                   CommonNavigationTransitionInfo.IsStaggerElement="True">
            <!--Double line list with text wrapping-->

            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>

                <TextBlock Style="{StaticResource BasicTextStyle}"
                           HorizontalAlignment="Center"
                           VerticalAlignment="Center"
                           TextAlignment="Center"
                           Text="Preview"
                           Grid.Row="0" />

                <StackPanel Orientation="Vertical"
                            Margin="0,10,0,0"
                            Grid.Row="1">

                    <TextBlock TextWrapping="Wrap"
                               Text="Brightness"
                               Style="{StaticResource BasicTextStyle}"
                               Margin="10,0,10,0"
                               VerticalAlignment="Center" />

                    <Slider x:Name="sldBrightness"
                            IsEnabled="True"
                            ValueChanged="sldBrightness_ValueChanged"
                            Margin="20,0,20,0"
                            FontFamily="Global User Interface"
                            Minimum="0"
                            Maximum="255"
                            LargeChange="25" />

                    <TextBlock TextWrapping="Wrap"
                               Text="Contrast"
                               Style="{StaticResource BasicTextStyle}"
                               Margin="10,0,10,0"
                               VerticalAlignment="Center" />

                    <Slider x:Name="sldContrast"
                            IsEnabled="True"
                            ValueChanged="sldContrast_ValueChanged"
                            Margin="20,0,20,0"
                            Minimum="0"
                            Maximum="10"
                            LargeChange="2" />
                </StackPanel>

                <Canvas x:Name="previewCanvas"
                        Width="320"
                        Height="240"
                        Background="Gray"
                        Grid.Row="2"
                        VerticalAlignment="Center"
                        HorizontalAlignment="Center">

                    <CaptureElement x:Name="previewElement"
                                    Width="320"
                                    Height="240" />
                </Canvas>

                <TextBlock x:Name="StatusBlock"
                           Grid.Row="3"
                           Margin="12,0,12,5"
                           VerticalAlignment="Center"
                           HorizontalAlignment="Center" />
            </Grid>

        </PivotItem>

        <!--Pivot item two-->
        <!--<PivotItem x:Uid="PivotItem2"
                   Margin="19,14.5,0,0"
                   Header="second"
                   DataContext="{Binding SecondGroup}"
                   d:DataContext="{Binding Groups[1], Source={d:DesignDataSource=/DataModel/SampleData.json, Type=data:SampleDataSource}}">
            -->
        <!--Double line list no text wrapping-->
        <!--
        </PivotItem>-->
    </Pivot>
</Grid>

<Page.BottomAppBar>
    <CommandBar>
        <AppBarButton x:Uid="StartAppBarButton"
                      x:Name="StartAppBarButton"
                      Label="start"
                      Icon="Video"
                      Click="StartAppBarButton_OnClick"/>

        <AppBarButton x:Uid="StopAppBarButton"
                      x:Name="StopAppBarButton"
                      Label="stop"
                      Icon="Stop"
                      Click="StopAppBarButton_OnClick"/>

        <CommandBar.SecondaryCommands>
            <!--<AppBarButton x:Uid="SecondaryButton1"
                          x:Name="SecondaryButton1"
                          Label="secondary command 1" />

            <AppBarButton x:Uid="SecondaryButton2"
                          x:Name="SecondaryButton2"
                          Label="secondary command 2" />-->
        </CommandBar.SecondaryCommands>
    </CommandBar>
</Page.BottomAppBar>

似乎设置值的调用成功,但值不会改变。合同也是如此。相同的代码在Windows 8上运行正常。

知道我做错了什么吗?

由于

1 个答案:

答案 0 :(得分:0)

经过调查,我发现手机不支持它。主叫:

_mediaCaptureMgr.VideoDeviceController.Brightness.Capabilities.Supported

返回false。