UWP 後臺保存圖片
在做UWP的時候,有一個需求,就是點擊下載按鈕,需要將當前頁面中的Image控件中顯示的圖片保存下來。
既然聊到了下載圖片,索性把添加圖片也講一下。
一:給Image控件添加圖片
xaml代碼:
<Image Source="Assets/icon/logo.png"
Name="Logo"/>
在xaml裏寫樣式特別簡單,只要在Image的Source屬性裏填上圖片的地址就好了。
c#代碼:
Logo.Source = new BitmapImage(new Uri("Assets/icon/logo.png"));
通過IDE查看定義可以看到,Image控件的Source屬性的類型是ImageSource類型,但是再查看ImageSource的定義發現是空的。
public ImageSource Source { get; set; }
而查看BitmapImage類的定義發現是繼承於ImageSource類。 ImageSource是父類而BitmapImage是子類。
說明我們在用c#代碼寫的時候,不能直接通過父類去定義。例如:
Logo.Source = new ImageSource(); //這種方式是錯誤的,會報錯
而應該用子類去寫
Logo.Source = new BitmapImage(new Uri("Assets/icon/logo.png"));
二:BitmapImage 位圖類
BitmapImage類 有一個 類型是Uri 類的參數的構造函數
public BitmapImage(Uri uriSource);
通過這個構造函數將圖片的地址賦值上去。
三:Uri類
Uri: Uniform Resource identifier 統一資源標識符
簡單來理解就是某個東西的標識,是一串字符串,用來標識的。
四:BackgroundDownloader 後臺下載器類
如果你要保存的圖片很大或者文件很大的時候,建議使用BackgroundDownloader後臺下載類。
//定義一個後臺下載器
BackgroundDownloader backgroundDownload = new BackgroundDownloader();
//創建一個下載任務對象 DownloadOperation download= backgroundDownload.CreateDownload(uri, newFile);
//開始下載 await download.StartAsync();
其中用調用下載器的CreateDownload()方法,創建一個下載任務
public DownloadOperation CreateDownload(Uri uri, IStorageFile resultFile);
查看定義可以看到有兩個參數
第一個參數是需要下載文件的uri地址,第二個參數是IStorageFile 類型的本地文件對象
五:IStorageFile 接口
看到前面帶了個I就知道是一個存儲文件的接口。
interface 接口
六:StorageFile 存儲文件類
該類繼承了IStorageFile 接口。
七:StorageFolder 文件夾類
在系統中圖片文件夾裏創建一個文件夾
//在系統已知的文件夾中找到圖片 這個文件夾 然後在裏面創建一個名字為ONE的文件夾
StorageFolder folder = await KnownFolders.PicturesLibrary.CreateFolderAsync("ONE", CreationCollisionOption.OpenIfExists);
第二個參數是指當你在創建文件夾時遇到已有文件夾的時候,該怎麽做。
然後可以用StorageFolder裏的CreateFileAsync() 方法創建一個StorageFile對象
StorageFile newFile = await folder.CreateFileAsync(imageName, CreationCollisionOption.OpenIfExists);
CreateFileAsync()定義
public IAsyncOperation<StorageFile> CreateFileAsync(string desiredName, CreationCollisionOption options); //名字 創建時發生文件碰撞怎麽辦
八:總結一下思路
1.先用StorageFolder創建一個文件夾
2.再用CreateFileAsync() 創建一個文件
3.創建一個後臺下載器
4.創建一個後臺任務,參數是uri和StorageFile
public async Task SaveImage(string imageName,string imageUri) { BackgroundDownloader backgroundDownload = new BackgroundDownloader(); StorageFolder folder = await KnownFolders.PicturesLibrary.CreateFolderAsync("ONE", CreationCollisionOption.OpenIfExists); StorageFile newFile = await folder.CreateFileAsync(imageName, CreationCollisionOption.OpenIfExists); Uri uri = new Uri(imageUri); DownloadOperation download= backgroundDownload.CreateDownload(uri, newFile); await download.StartAsync(); }
將iamge控件上的地址和名字傳過來就ok了。
--------some words---------
1.Source 來源
2.Bit 點
3.map 地圖
4.bitmap 位圖
5.Uri:Uniform Resource identifier 統一資源標識符
6.Storage 存儲
7.Folder 文件夾
8.Interface 接口
9.Collision 碰撞
10. CreationCollisionOption 創建時發生碰撞的操作
11.
-------- -the end------------
UWP 後臺保存圖片