【问题标题】:Save Photo in media library windows phone 8.1在媒体库中保存照片 windows phone 8.1
【发布时间】:2015-09-06 22:39:07
【问题描述】:

我正在从列表视图中获取照片路径并在详细屏幕中显示图像。 详细页面代码在这里。

 //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();  
             }
            }

    }

我无法保存图片,错误在于

这里的错误是一个异常。

      StorageFile file = await picker.PickSaveFileAsync();

此方法下有时会出现绿线“显示使用picksavefile并继续”但是当我使用此方法时会显示错误。无法理解这个问题。如何将我的图片保存在媒体库中

【问题讨论】:

  • 如果您正在寻找将 Image 保存到文件的方法,那么this question 可以为您提供帮助。
  • 没有帮助..你能通过我的代码给我确切的答案吗?

标签: c# xaml windows-phone-8.1


【解决方案1】:

SaveJpeg 方法是命名空间System.Windows.Media.Imaging.Extensions 的扩展方法。在源文件顶部添加 using:

using System.Windows.Media.Imaging.Extensions;

而且,您可能打算使用System.Windows.Media.Imaging.WriteableBitmap 而不是Windows.UI.Xaml.Media.Imaging.WriteableBitmap

【讨论】:

  • 不,无法解决此问题。主题是使用SaveJpeg保存图片。
  • 是的,这就是我要帮助您解决的问题...您可以使用 System.Windows.Media.Imaging.WriteableBitmap 代替 Windows.UI.Xaml.Media.Imaging.WriteableBitmap 吗?我猜您从某个地方获取了一些示例代码,但您找不到 SaveJpeg 方法。该方法适用于 System.Windows.Media.Imaging.WriteableBitmap。
  • 我无法获得此参考。没有通过添加参考得到这个
  • 是的.. 我得到了这个示例代码并想在我的测试应用程序中实现同样的东西
  • Extensions.SaveJpeg 位于 Microsoft.Phone 库中。 System.Windows.Media.Imaging.WriteableBitmap 在程序集 System.Windows 中。你的项目中有这些参考资料吗?项目类型到底是什么? (windows phone 8.1,通用应用,可移植类库)
【解决方案2】:

您可能想要使用 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();  
 }
}

【讨论】:

  • 上面的代码不起作用,我必须从列表视图中给出我自己的图片。?这段代码出现异常
  • 将“grdRender”替换为作为控件的“imaged”。在这里你可以看到一个示例代码github.com/Satur01/Demo01RenderTargetBitMap
  • StorageFile 文件 = 等待picker.PickSaveFileAsync();此行创建异常,我无法得到解决方案。评论中的上述示例适用于 windows
猜你喜欢
  • 1970-01-01
  • 2015-08-19
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多