2015-09-01 55 views
0

我從列表視圖中獲取照片路徑並顯示詳細的圖像屏幕。 詳細頁面代碼在這裏。將媒體庫中的照片保存爲windows phone 8.1

//Imaged is my image control in Xaml. 

protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     var imagePath = e.Parameter as string; 
     imaged.Source = new BitmapImage(new Uri(imagePath, UriKind.RelativeOrAbsolute)); 


     var imgsource = imaged.Source; 
    } 

我想通過單擊保存按鈕事件將此圖片保存在媒體庫中。

這是我的保存按鈕事件代碼。

private async void ApplicationBarIconButton_Click_SaveToPictures(object sender, RoutedEventArgs e) 
    { 

     FileSavePicker picker = new FileSavePicker(); 

      // picker.FileTypeChoices.Add("PNG File", new List<string>() { ".png" }); 
      picker.FileTypeChoices.Add("JPEG image", new string[] { ".jpg" }); 
      picker.FileTypeChoices.Add("PNG image", new string[] { ".png" }); 
      picker.FileTypeChoices.Add("BMP image", new string[] { ".bmp" }); 
      picker.DefaultFileExtension = ".png"; 



      picker.SuggestedFileName = "bomdiaimg"; 
      picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; 

      StorageFile file = await picker.PickSaveFileAsync(); 
      // StorageFile file = await picker.PickSaveFileAndContinue(); 
      if (file != null) 
      { 
       RenderTargetBitmap renderTargetBitMap = new RenderTargetBitmap(); 



      await renderTargetBitMap.RenderAsync(imaged, (int)imaged.Width, (int)imaged.Height); 

      var pixels = await renderTargetBitMap.GetPixelsAsync(); 



      using (IRandomAccessStream randomAccessStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
      { 
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, randomAccessStream); 
        byte[] bytes = pixels.ToArray(); 
        encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)renderTargetBitMap.PixelWidth, (uint)renderTargetBitMap.PixelHeight, 96, 96, bytes); await encoder.FlushAsync(); 
      } 
      } 

    } 

我無法保存圖片的錯誤是

在這裏的錯誤是一個例外。這種方法「這表明,使用picksavefile並繼續」但是,當我用這個方法則錯誤顯示下

 StorageFile file = await picker.PickSaveFileAsync(); 

一些次綠線。無法理解這個問題。如何將圖片保存在媒體庫中

+0

如果你正在尋找一種方法來保存*圖片*到文件,然後按[這個問題](http://stackoverflow.com/q/22896979/2681948)可以幫助你。 – Romasz

+0

沒有幫助..你能否通過我的代碼向我發送確切的答案? – Arsal

回答

0

SaveJpeg方法是名稱空間System.Windows.Media.Imaging.Extensions的擴展方法。一個使用在源文件的頂部添加:

using System.Windows.Media.Imaging.Extensions; 

而且,可能你想用System.Windows.Media.Imaging.WriteableBitmap代替Windows.UI.Xaml.Media.Imaging.WriteableBitmap

+0

不,不能解決這個問題。主要的主題是使用SaveJpeg保存圖片。 – Arsal

+0

是的,這就是我想幫助您解決的問題......您可以使用System.Windows.Media.Imaging.WriteableBitmap而不是Windows.UI.Xaml.Media.Imaging.WriteableBitmap?我猜你已經從某處獲取了一些示例代碼,並且找不到SaveJpeg方法。該方法適用於System.Windows.Media.Imaging.WriteableBitmap。 –

+0

我無法獲得此參考。沒有得到這個通過添加引用 – Arsal

0

您可能想使用RenderTargetBitMap來保存控制圖像。請檢查此示例代碼。

FileSavePicker picker = new FileSavePicker(); 
picker.FileTypeChoices.Add("JPG File", new List<string>() { ".jpg" }); 
StorageFile file = await picker.PickSaveFileAsync(); if (file != null) 
{ 
    RenderTargetBitmap renderTargetBitMap = new RenderTargetBitmap(); 
//With this method we can make our XAML elements in an image. await  


renderTargetBitMap.RenderAsync(grdRender, (int)grdRender.Width, (int)grdRender.Height); 

var pixels = await renderTargetBitMap.GetPixelsAsync(); 



using (IRandomAccessStream randomAccessStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
{ 
     var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, randomAccessStream); 
     byte[] bytes = pixels.ToArray(); 
     encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)renderTargetBitMap.PixelWidth, (uint)renderTargetBitMap.PixelHeight, 96, 96, bytes); await encoder.FlushAsync(); 
} 
} 
+0

上面的代碼不工作,我必須從列表視圖中給我自己的圖片。此代碼例外 – Arsal

+0

將「grdRender」替換爲控件的「imaged」。在這裏你可以看到一個示例代碼https://github.com/Satur01/Demo01RenderTargetBitMap –

+0

StorageFile file = await picker.PickSaveFileAsync();這條線創建異常,我無法得到解決方案。上面的評論樣本是針對windows的 – Arsal

相關問題