2015-09-01 57 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

相关问题