0
카메라의 비디오 신호의 밝기 설정을 변경하려고합니다. 아래 코드는 .cs 파일과 XAML 파일입니다. Windows Phone 8.1 카메라에서 밝기를 변경하는 방법은 무엇입니까?
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에서 제대로 작동합니다.
내가 뭘 잘못하고 있니? 조사 후