代替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);
Thx @schumi但可以帮助我如何使用此在我的代码中的扩展方法,并且你能够正确地实现你提供的所有上述方法。实际上,我对uwp并不是完全意识到所有东西都是新的。 – micky
我修改了答案,希望它有帮助。虽然扩展方法不是UWP专用的,但是一般情况下可以在C#中使用,据我所知,这是一件非常酷的事情;) – schumi1331
Thx很多schumi ..它的工作原理。但它只下载一个图像,并将其替换为另一个图像,我如何下载多个不同的图像。 – micky