【问题标题】:Capturing Photo from PhotocaptureDevice从 PhotocaptureDevice 捕捉照片
【发布时间】:2013-07-15 09:02:36
【问题描述】:

我正在创建一个图像编辑应用程序。我想为用户提供选项,他还可以在运行时捕获图像并对捕获的图像应用编辑效果。目前我正在按照Advanced Photo Capture for windows Phone 8的指示进行操作。

有两个问题 首先我面临的是,当我按下捕捉按钮时,捕捉到的图像将是一个倒置的图像。如果我将手机置于横向模式,那么它会拍出正确的照片。

当应用程序启动时,屏幕上什么也没有,换句话说就是全黑。我希望屏幕显示相机视图,以便用户知道他要捕捉的内容。

下面是我的 Mainpage.xaml.cs 文件和 MainPage.xaml 文件的代码。

namespace CapturingPhoto {
public partial class MainPage : PhoneApplicationPage {

    private MemoryStream imageStream;
    private PhotoCaptureDevice captureDevice;
    private CameraCaptureSequence seq;
   // Constructor
    public MainPage() {
        InitializeComponent();
        imageStream = new MemoryStream();
        // Sample code to localize the ApplicationBar
        //BuildLocalizedApplicationBar();

        prepareResouceToCapture();
    }

    private async void prepareResouceToCapture() { 
        if((!PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Back)) &&
            (!PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Front))){
                return;
        }
       Windows.Foundation.Size size;
        if(PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Back)){
            IReadOnlyList <Windows.Foundation.Size> avalaibleSizeList =  
                PhotoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Back);
            size = avalaibleSizeList[0];
            this.captureDevice = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Back, size);
        }
        else{

            IReadOnlyList<Windows.Foundation.Size> avalaibleSizeList =
                PhotoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Front);
            size = avalaibleSizeList[0];
            this.captureDevice = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Front, size);

        }


     //  await this.captureDevice.SetCaptureResolutionAsync(size);
      // await this.captureDevice.SetPreviewResolutionAsync(size);
     //  BackgroundVideoBrush.SetSource(this.captureDevice);




    }



    private async void onCaptureImage(object sender, RoutedEventArgs e) {
        seq = captureDevice.CreateCaptureSequence(1);
        captureDevice.SetProperty(KnownCameraPhotoProperties.FlashMode, FlashState.On);
        captureDevice.SetProperty(KnownCameraGeneralProperties.PlayShutterSoundOnCapture, false);
        captureDevice.SetProperty(KnownCameraGeneralProperties.AutoFocusRange, AutoFocusRange.Normal);
        seq.Frames[0].CaptureStream = imageStream.AsOutputStream();
        await captureDevice.PrepareCaptureSequenceAsync(seq);
        CaptureImage();


    }


    public async void CaptureImage() {
        await seq.StartCaptureAsync();

        // Set the stream position to the beginning.
        imageStream.Seek(0, SeekOrigin.Begin);

        MediaLibrary library = new MediaLibrary();
        Picture picture1 = library.SavePictureToCameraRoll("image1", imageStream);

    }


}

}

Xaml 文件的代码

<phone:PhoneApplicationPage
x:Class="CapturingPhoto.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">

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

    <!-- LOCALIZATION NOTE:
        To localize the displayed strings copy their values to appropriately named
        keys in the app's neutral language resource file (AppResources.resx) then
        replace the hard-coded text value between the attributes' quotation marks
        with the binding clause whose path points to that string name.

        For example:

            Text="{Binding Path=LocalizedResources.ApplicationTitle, Source={StaticResource LocalizedStrings}}"

        This binding points to the template's string resource named "ApplicationTitle".

        Adding supported languages in the Project Properties tab will create a
        new resx file per language that can carry the translated values of your
        UI strings. The binding in these examples will cause the value of the
        attributes to be drawn from the .resx file that matches the
        CurrentUICulture of the app at run time.
     -->



    <!--ContentPanel - place additional content here-->

    <Canvas x:Name="VideoCanvas" RenderTransformOrigin="0.5,0.5" Canvas.ZIndex="0">
        <Canvas.RenderTransform>
            <CompositeTransform/>
        </Canvas.RenderTransform>
        <Canvas.Background>
            <!-- The background contains the camera view finder
                 encapsulated in VideoBrush. -->
            <VideoBrush x:Name="BackgroundVideoBrush" >
                <VideoBrush.RelativeTransform>
                    <CompositeTransform x:Name="VideoBrushTransform" CenterY="0.5" CenterX="0.5"/>
                </VideoBrush.RelativeTransform>
            </VideoBrush>
        </Canvas.Background>
    </Canvas>

    <Button x:Name="btn_Edit" Content="Capture" HorizontalAlignment="Left" 
                Margin="23,691,0,0" VerticalAlignment="Top" 
                Width="400" Click="onCaptureImage"/>



    <!--Uncomment to see an alignment grid to help ensure your controls are
        aligned on common boundaries.  The image has a top margin of -32px to
        account for the System Tray. Set this to 0 (or remove the margin altogether)
        if the System Tray is hidden.

        Before shipping remove this XAML and the image itself.-->
    <!--<Image Source="/Assets/AlignmentGrid.png" VerticalAlignment="Top" Height="800" Width="480" Margin="0,-32,0,0" Grid.Row="0" Grid.RowSpan="2" IsHitTestVisible="False" />-->
</Grid>

【问题讨论】:

    标签: c# camera windows-phone-8 image-capture


    【解决方案1】:

    我看到了那个字符串:

    BackgroundVideoBrush.SetSource(this.captureDevice);
    

    是评论。 如果 VideoBrush 为空,您将看不到相机视图。

    【讨论】:

      【解决方案2】:

      要回答您的第一个问题,请使用“EncodeWithOrientation”属性。将以下 switch 语句放在 onCaptureImage() 的顶部。这将确保在纵向模式下拍照时保存的图像处于正确的方向。

           // Initialize variables.
              int encodedOrientation = 0;
              int sensorOrientation = (Int32)this._camera.SensorRotationInDegrees;
      
              switch (this.Orientation)
              {
                  // Camera hardware shutter button up.
                  case PageOrientation.LandscapeLeft:
                      encodedOrientation = -90 + sensorOrientation;
                      break;
                  // Camera hardware shutter button down.
                  case PageOrientation.LandscapeRight:
                      encodedOrientation = 90 + sensorOrientation;
                      break;
                  // Camera hardware shutter button right.
                  case PageOrientation.PortraitUp:
                      encodedOrientation = 0 + sensorOrientation;
                      break;
                  // Camera hardware shutter button left.
                  case PageOrientation.PortraitDown:
                      encodedOrientation = 180 + sensorOrientation;
                      break;
              }
              // Apply orientation to image encoding.
              this._camera.SetProperty(KnownCameraGeneralProperties.EncodeWithOrientation, encodedOrientation);
      

      另请参阅 MSDN 上的以下内容:http://msdn.microsoft.com/EN-US/library/windowsphone/develop/windows.phone.media.capture.knowncamerageneralproperties.encodewithorientation(v=vs.105).aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-16
        • 2015-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多