2014-10-14 11 views
6

Meine App sollte ein Bild von der Kamera speichern. Ich schrieb den folgenden Code:Bild vor dem Speichern in Windows Phone 8.1 drehen

  1. Methode, die die Kamera initialisiert.

    Windows.Media.Capture.MediaCapture takePhotoManager; 
    public async void InitializeCamera() 
    { 
        takePhotoManager = new Windows.Media.Capture.MediaCapture(); 
    
        await takePhotoManager.InitializeAsync(); 
        takePhotoManager.SetPreviewRotation(VideoRotation.Clockwise90Degrees); 
        PhotoPreview.Source = takePhotoManager; 
        await takePhotoManager.StartPreviewAsync(); 
        // to stop it 
        //await takePhotoManager.StopPreviewAsync(); 
    } 
    
  2. Methode, die ein Foto speichert:

    public async void SavePhoto() 
    { 
        ImageEncodingProperties imgFormat = ImageEncodingProperties.CreateJpeg(); 
    
        var file = await KnownFolders.PicturesLibrary.CreateFileAsync("Photo.jpg", CreationCollisionOption.ReplaceExisting); 
    
        await takePhotoManager.CapturePhotoToStorageFileAsync(imgFormat, file); 
    } 
    
  3. Vorschau

    <CaptureElement x:Name="PhotoPreview" FlowDirection="LeftToRight" 
         HorizontalAlignment="Center" 
         VerticalAlignment="Center" 
         Stretch="UniformToFill"> 
        </CaptureElement> 
    

Ich habe zwei Probleme: 1. Die Vorschau nicht den ganzen Raum füllt enter image description here

  1. Nach dem Speichern bekomme ich so etwas: (ohne Rotation und mit transparenten Schichten auf beiden Seiten).
    enter image description here

Dank

+1

Vielleicht Antwort auf [diese Frage] (http://stackoverflow.com/q/23709547/2681948) wird helfen. Sie können auch einige Informationen finden [hier in diesem Beitrag] (http://www.romasz.net/how-to-take-a-photo-in-windows-runtime/). – Romasz

+0

Danke, es löst mein Problem mit transparenten Räumen verbunden. Leider habe ich immer noch Probleme mit dem Bild nach dem Speichern zu drehen und den gesamten Platz in der Vorschau zu füllen. – pbalut

+0

Haben Sie versucht mit: 'HorizontalAlignment =" Strech "VerticalAlignment =" Strech "' von * CaptureElement * in XAML? – Romasz

Antwort

0

denke ich, das Problem in der Platte sein können, die Sie verwenden. Als ich Grid.Row Eigenschaft in Ihrem CaptureElement in XAML dann vermute ich, dass Sie StackPanel verwenden - es ist ein Panel, das nicht auf Ihren Bildschirm streckt, es stapelt nur Elemente.

Das, was Sie mit Grid möglich sein, zu tun versuchen sollte, wie ich den folgenden Code überprüft haben sollte funktionieren:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <StackPanel Orientation="Vertical" Grid.Row="0"> 
     <Button Click="InitCameraBtn_Click" Content="Initialize Camera" /> 
     <Button Click="StartPreviewBtn_Click" Content="Start Capture Preview" /> 
     <Button Click="StopPreviewBtn_Click" Content="Stop Capture Preview" /> 
    </StackPanel> 

    <CaptureElement x:Name="PhotoPreview" Stretch="UniformToFill" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
</Grid> 
+0

Danke Romasz. Ja, ich habe StackPanel benutzt. Deine Lösung ist richtig, aber wenn du es unter dem Link [link] (https://onedrive.live.com/redir?resid=82A66D196A4DA30D!24008&authkey=!AB4fTSr-P-scBSw&v=3&thint=photo%2cjpg) siehst, gibt es immer noch schwarze Räume in der Nähe von Bild von der Kamera. – pbalut

+0

@ user3149172 Es ist wahrscheinlich, weil, wenn Sie initialisieren, wählen Sie die Auflösung, die die größte Breite hat (auf meinem Telefon seine 3552x2000). Tatsächlich gibt es andere Auflösungen und zum Beispiel 3264x2448 könnte besser geeignet sein. Führen Sie im Debug-Modus: 'var resols = captureManager.VideoDeviceController.GetAvailableMediaStreamProperties (MediaStreamType.Photo) .ToList();' und sehen Sie, welche Auflösungen Sie haben.Sie können auch daran denken, den Code 'var maxResolution = captureManager.VideoDeviceController.GetAvailableMedi ...' für Ihre Zwecke zu ändern. – Romasz

+0

Ich denke, das liegt an meiner Sichtweise. Meine maxResolution ist in Ordnung, aber wenn ich einige Steuerelemente über und unter CaptureElement hinzufüge, wird es skaliert und ich habe schwarze Lücken auf der linken Seite und auf der rechten Seite des Bildes. Aber ich weiß nicht, wie das Problem gelöst wird ... – pbalut

-1

Ich kann mit der ersten Ausgabe helfen - die Vorschau Orientierung zu ändern. Es sieht so aus, als ob wir es bei einem Ereignis der Orientierungsänderung manuell ändern müssen. Der Code ist in Javascript. C# sollte ähnlich sein:

capture = new CaptureNS.MediaCapture(); 
//additional capture settings and init 

function onOrientationChanged(e) { 
    var o = e.orientation; 
    //portrait 
    if (o == 0) { 
     capture && capture.setPreviewRotation(Windows.Media.Capture.VideoRotation.clockwise90Degrees); 
    //landscape 
    } else if (o == 1) { 
     capture && capture.setPreviewRotation(Windows.Media.Capture.VideoRotation.none); 
    } else if (o == 2) { 
     capture && capture.setPreviewRotation(Windows.Media.Capture.VideoRotation.clockwise270Degrees); 
    } else if (o == 3) { 
     capture && capture.setPreviewRotation(Windows.Media.Capture.VideoRotation.clockwise180Degrees); 
    } 
} 

orientationSensor = Windows.Devices.Sensors.SimpleOrientationSensor.getDefault(); 
if (orientationSensor) { 
    orientationSensor.onorientationchanged = onOrientationChanged;  
} 

Ich habe keine einfache Möglichkeit gefunden, die Ausrichtung der gespeicherten Datei zu ändern.

Verwandte Themen