2014-10-14 20 views
6

La mia app dovrebbe salvare un'immagine dalla fotocamera. Ho scritto il codice di seguito:Ruota l'immagine prima di salvare in Windows Phone 8.1

  1. Metodo che inizializza la telecamera.

    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. Metodo che consente di risparmiare una foto:

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

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

Ho due problemi: 1. l'anteprima non riempire l'intero spazio enter image description here

  1. Dopo aver salvato, ottengo qualcosa di simile: (senza rotazione e con strati trasparenti su entrambi i lati).
    enter image description here

Grazie

+1

Forse la risposta a [questa domanda] (http://stackoverflow.com/q/23709547/2681948) aiuterà. Potresti anche trovare alcune informazioni [qui a questo post] (http://www.romasz.net/how-to-take-a-photo-in-windows-runtime/). – Romasz

+0

Grazie, risolve il mio problema relativo agli spazi trasparenti. Sfortunatamente, ho ancora problemi con la rotazione dell'immagine dopo aver salvato proces e riempire tutto lo spazio nell'anteprima. – pbalut

+0

Hai provato con: 'HorizontalAlignment =" Strech "VerticalAlignment =" Strech "' di * CaptureElement * in XAML? – Romasz

risposta

0

Credo che il problema potrebbe essere nel pannello che si sta utilizzando. Come io non riesco a vedere Grid.Row proprietà nella CaptureElement in XAML poi ho il sospetto che si sta utilizzando StackPanel - è un pannello che non si estendono al vostro schermo solo impila elementi.

La cosa si sta cercando di fare dovrebbe essere possibile con griglia, come ho controllato il seguente codice dovrebbe funzionare:

<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

Grazie Romasz. Sì, ho usato StackPanel. La tua soluzione è giusta, ma se puoi vedere nel link [link] (https://onedrive.live.com/redir?resid=82A66D196A4DA30D!24008&authkey=!AB4fTSr-P-scBSw&v=3&ithintphotofoto2gjpg) ci sono ancora spazi neri vicino all'immagine dalla fotocamera. – pbalut

+0

@ user3149172 È probabile perché quando si inizializza, si sceglie la risoluzione con la larghezza maggiore (sul mio telefono è 3552x2000). In effetti ci sono altre risoluzioni e per esempio 3264x2448 potrebbe essere più adatto. Esegui in modalità di debug: 'var resols = captureManager.VideoDeviceController.GetAvailableMediaStreamProperties (MediaStreamType.Photo) .ToList();' e vedi quali risoluzioni hai.Potresti anche pensare di cambiare il codice 'var maxResolution = captureManager.VideoDeviceController.GetAvailableMedi ...' per i tuoi scopi. – Romasz

+0

Penso che sia causato dal mio punto di vista. Il mio maxResolution è OK, ma se aggiungo alcuni controlli sopra e sotto CaptureElement, è ridimensionato e ho degli spazi neri a sinistra e a destra dell'immagine. Ma non so come risolvere il problema ... – pbalut

-1

posso aiutare con il primo numero - cambiare l'orientamento di anteprima. Sembra che dobbiamo cambiarlo manualmente sull'evento di cambio di orientamento. Il codice è in Javascript. C# dovrebbe essere simile:

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;  
} 

Non ho trovato alcun modo semplice per modificare l'orientamento del file salvato.

Problemi correlati