Windows Phone 8.1应用程序以全屏显示图像预览

时间:2016-01-10 06:34:27

标签: c# xaml uiimageview windows-phone-8.1 preview

在我的Windows Phone 8.1应用程序中,我有一个相机功能,但我似乎无法全屏显示图像预览。任何人都可以看到必须做的事情吗?

ButtonCapture_Click初始化imagePreview,previewElement_Tapped实际拍摄快照。

的Xaml

<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <!--TitlePanel contains the name of the application and page title-->
    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="0,18,0,18">

        <TextBlock Text="StudyToolMobile" Style="{StaticResource TitleTextBlockStyle}" Margin="18,0"/>
    </StackPanel>

    <!--ContentPanel - place additional content here-->
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="18,0,18,0">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="4*" />
            <ColumnDefinition Width="2*" />
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Row="0" Grid.ColumnSpan="2" Style="{StaticResource BodyTextBlockStyle}" Text="Enter some text below and click Save to insert a new TodoItem item into your database" TextWrapping="Wrap"/>
        <TextBox Grid.Row="1" Grid.Column="0" Name="TextInput" Text="" />
        <StackPanel Grid.Row ="1" Grid.Column="1"  Orientation="Horizontal">
            <AppBarButton Label="Photo" Icon="Camera" Name="ButtonCapture" 
              Click="ButtonCapture_Click" Height="78" Width="62" />
            <AppBarButton Label="Upload" Icon="Upload" Name="ButtonSave" 
              Click="ButtonSave_Click"/>
        </StackPanel>
        <Grid Grid.Row="2" Name="captureGrid" Grid.RowSpan="3" Grid.ColumnSpan="2" 
  Canvas.ZIndex="99" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" 
  Visibility="Collapsed">
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <CaptureElement Grid.Row="0" x:Name="previewElement" Tapped="previewElement_Tapped" />
            <Image Grid.Row="0" Name="imagePreview" Visibility="Collapsed" Margin="0,262,0,115"  />
            <StackPanel Grid.Row="1" Name="captureButtons" 
            Orientation="Horizontal" Visibility="Collapsed">
                <TextBlock Name="TextCapture" VerticalAlignment="Bottom" />
                <AppBarButton Label="Retake" Icon="Redo" Name="ButtonRetake" 
                  Click="ButtonRetake_Click" />
                <AppBarButton Label="Cancel" Icon="Cancel" Name="ButtonCancel" 
                  Click="ButtonCancel_Click" />
            </StackPanel>
        </Grid>
        <TextBlock Grid.Row="2" Grid.ColumnSpan="2" Style="{StaticResource BodyTextBlockStyle}" Text="Click refresh below to load the unfinished TodoItems from your database. Use the checkbox to complete and update your TodoItems" TextWrapping="Wrap"/>
        <Button Grid.Row="3" Grid.ColumnSpan="2" Name="ButtonRefresh" Click="ButtonRefresh_Click" HorizontalAlignment="Stretch">Refresh</Button>
        <ListView  Grid.Row="4" Grid.ColumnSpan="2" Name="ListItems">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <CheckBox Name="CheckBoxComplete" IsChecked="{Binding Complete, Mode=TwoWay}" 
                            Checked="CheckBoxComplete_Checked" Content="{Binding Text}" 
                            Margin="10,5" VerticalAlignment="Center"/>
                        <Image Name="ImageUpload" Source="{Binding ImageUri, Mode=OneWay}" 
                            MaxHeight="150"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Grid>

代码

    // Use a StorageFile to hold the captured image for upload.
    StorageFile media = null;
    MediaCapture cameraCapture;
    bool IsCaptureInProgress;

    private async Task CaptureImage()
    {
        // Capture a new photo or video from the device.
        cameraCapture = new MediaCapture();
        cameraCapture.Failed += cameraCapture_Failed;

        // Initialize the camera for capture.
        await cameraCapture.InitializeAsync();

        cameraCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees);
        cameraCapture.SetRecordRotation(VideoRotation.Clockwise90Degrees);


        captureGrid.Visibility = Windows.UI.Xaml.Visibility.Visible;
        previewElement.Visibility = Windows.UI.Xaml.Visibility.Visible;
        previewElement.Source = cameraCapture;
        await cameraCapture.StartPreviewAsync();
    }

    private async void previewElement_Tapped(object sender, TappedRoutedEventArgs e)
    {
        // Block multiple taps.
        if (!IsCaptureInProgress)
        {
            IsCaptureInProgress = true;

            Random rnd = new Random();
            int number = rnd.Next(1, 20);
            string numberString = number.ToString();

            string jpgName = numberString + ".jpg";


            // Create the temporary storage file.
            media = await ApplicationData.Current.LocalFolder
                .CreateFileAsync(jpgName, CreationCollisionOption.ReplaceExisting);

            // Take the picture and store it locally as a JPEG.
            await cameraCapture.CapturePhotoToStorageFileAsync(
                ImageEncodingProperties.CreateJpeg(), media);

            captureButtons.Visibility = Visibility.Visible;

            // Use the stored image as the preview source.
            BitmapImage tempBitmap = new BitmapImage(new Uri(media.Path));
            imagePreview.Source = tempBitmap;
            imagePreview.Visibility = Visibility.Visible;
            previewElement.Visibility = Visibility.Collapsed;
            IsCaptureInProgress = false;
        }
    }

    private async void cameraCapture_Failed(MediaCapture sender, MediaCaptureFailedEventArgs errorEventArgs)
    {
        // It's safest to return this back onto the UI thread to show the message dialog.
        MessageDialog dialog = new MessageDialog(errorEventArgs.Message);
        await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
            async () => { await dialog.ShowAsync(); });
    }

    private async void ButtonCapture_Click(object sender, RoutedEventArgs e)
    {
        // Prevent multiple initializations.
        ButtonCapture.IsEnabled = false;

        await CaptureImage();
    }

2 个答案:

答案 0 :(得分:1)

您已将保证金设定为图像预览。将顶部和底部边距设置为0,以便图像占据整个空间......

  <Image Grid.Row="0" Name="imagePreview" Visibility="Collapsed" Margin="0"  />

答案 1 :(得分:0)

请勿使用以下API:

cameraCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees);
cameraCapture.SetRecordRotation(VideoRotation.Clockwise90Degrees);

相反,要旋转预览和录制的视频,请参阅CameraStarterKit SDK sample

    /// <summary>
    /// Gets the current orientation of the UI in relation to the device (when AutoRotationPreferences cannot be honored) and applies a corrective rotation to the preview
    /// </summary>
    private async Task SetPreviewRotationAsync()
    {
        // Only need to update the orientation if the camera is mounted on the device
        if (_externalCamera) return;

        // Calculate which way and how far to rotate the preview
        int rotationDegrees = ConvertDisplayOrientationToDegrees(_displayOrientation);

        // The rotation direction needs to be inverted if the preview is being mirrored
        if (_mirroringPreview)
        {
            rotationDegrees = (360 - rotationDegrees) % 360;
        }

        // Add rotation metadata to the preview stream to make sure the aspect ratio / dimensions match when rendering and getting preview frames
        var props = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview);
        props.Properties.Add(RotationKey, rotationDegrees);
        await _mediaCapture.SetEncodingPropertiesAsync(MediaStreamType.VideoPreview, props, null);
    }

    /// <summary>
    /// Records an MP4 video to a StorageFile and adds rotation metadata to it
    /// </summary>
    /// <returns></returns>
    private async Task StartRecordingAsync()
    {
        try
        {
            // Create storage file in Pictures Library
            var videoFile = await KnownFolders.PicturesLibrary.CreateFileAsync("SimpleVideo.mp4", CreationCollisionOption.GenerateUniqueName);

            var encodingProfile = MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Auto);

            // Calculate rotation angle, taking mirroring into account if necessary
            var rotationAngle = 360 - ConvertDeviceOrientationToDegrees(GetCameraOrientation());
            encodingProfile.Video.Properties.Add(RotationKey, PropertyValue.CreateInt32(rotationAngle));

            Debug.WriteLine("Starting recording...");

            await _mediaCapture.StartRecordToStorageFileAsync(encodingProfile, videoFile);
            _isRecording = true;

            Debug.WriteLine("Started recording!");
        }
        catch (Exception ex)
        {
            // File I/O errors are reported as exceptions
            Debug.WriteLine("Exception when starting video recording: {0}", ex.ToString());
        }
    }