2016-12-07 34 views
0

的攻试图捕捉UWP截图但是,一些问题正在兴起,说试图采取截图在UWP编程上的图像

1)可写的地图不包含渲染的定义。

2)可写的地图不包含用于Save.jpeg

定义

3)键入或命名空间媒体库不找到。 任何类型的帮助将不胜感激。 代码

private void Download(object sender, TappedRoutedEventArgs e) 
     { 
      // Create a WriteableBitmap with height and width same as that of Layoutroot 
      WriteableBitmap bmp = new WriteableBitmap(480, 696); 

      //Render the layoutroot element on it 
      bmp.Render(Scrshot, null); 
      bmp.Invalidate(); 


      //Save the image to Medialibrary 

      //create a stream of image 
      var ms = new MemoryStream(); 
      bmp.SaveJpeg(ms, 480, 696, 0, 100); 
      ms.Seek(0, SeekOrigin.Begin); 


      //every path must be unique 
      var filePath = "myfile" + DateTime.Now.ToString(); 

      //Remember to include Medialib capabilty from WMAppManifest.xml for acessing the Medialibrary 
      var lib = new MediaLibrary(); 
      lib.SavePicture(filePath, ms); 

      MessageBox.Show("Saved in your media library!", "Done", MessageBoxButton.OK); 
     } 

回答

0

代替WriteableBitmap使用RenderTargetBitmap创建一个可见的UIElement的位图表示。为了这个位图保存为一个文件,你可以用我创造了这个扩展方法(here's a great example for extension methods):

public static class RenderTargetBitmapExtensions { 
    public static async Task<StorageFile> ToFile(this RenderTargetBitmap renderTargetBitmap, string filename, StorageFolder folder = null, bool overrideExisting = true) { 
     if (folder == null) folder = ApplicationData.Current.TemporaryFolder; 

     try { 
      byte[] pixels = (await renderTargetBitmap.GetPixelsAsync()).ToArray(); 

      StorageFile outputFile = await folder.CreateFileAsync(filename, overrideExisting ? CreationCollisionOption.ReplaceExisting : CreationCollisionOption.GenerateUnique); 
      var bitmapEncodingMode = BitmapEncoder.PngEncoderId; 

      using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite)) { 
       var encoder = await BitmapEncoder.CreateAsync(bitmapEncodingMode, writeStream); 
       encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, (uint)renderTargetBitmap.PixelWidth, (uint)renderTargetBitmap.PixelHeight, 96, 96, pixels); 
       await encoder.FlushAsync(); 
      } 
      return outputFile; 
     } catch { 
      return null; 
     } 
    } 
} 

终于搞定了公共图像文件夹(如MediaLibrary是一个Silverlight类和UWP不存在了),可以将下面根据this thread做:

StorageFolder picturesLibrary = KnownFolders.PicturesLibrary; 
StorageFolder savedPicturesFolder = await picturesLibrary.CreateFolderAsync("Saved Pictures", CreationCollisionOption.OpenIfExists); 

注:默认情况下,应用程序不能访问到的图片库。您必须在Package.appxmanifest中添加该功能。打开Package.appxmanifest并点击Capabilities选项卡。有一个图片库的复选框。

所以整个代码要做到这一点应该是:

RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(); 
await renderTargetBitmap.RenderAsync(LayoutRoot, Convert.ToInt32(LayoutRoot.ActualWidth), Convert.ToInt32(LayoutRoot.ActualHeight)); 

StorageFolder savedPicturesFolder = await KnownFolders.PicturesLibrary.CreateFolderAsync("Saved Pictures", CreationCollisionOption.OpenIfExists); 

await renderTargetBitmap.ToFile("filename.jpg", savedPicturesFolder); 

或者,如果你不想覆盖现有文件,最后一行是:

await renderTargetBitmap.ToFile("filename.jpg", savedPicturesFolder, false); 

对于您也可以创建一个基于时间的文件名:

string filename = String.Format("downloaded_{0}.jpg", DateTime.Now.ToString("yyyyMMdd_HHmmss")); 
await renderTargetBitmap.ToFile(filename, savedPicturesFolder, false); 
+0

Thx @schumi但可以帮助我如何使用此在我的代码中的扩展方法,并且你能够正确地实现你提供的所有上述方法。实际上,我对uwp并不是完全意识到所有东西都是新的。 – micky

+0

我修改了答案,希望它有帮助。虽然扩展方法不是UWP专用的,但是一般情况下可以在C#中使用,据我所知,这是一件非常酷的事情;) – schumi1331

+0

Thx很多schumi ..它的工作原理。但它只下载一个图像,并将其替换为另一个图像,我如何下载多个不同的图像。 – micky