2017-09-10 85 views
0

最終,我的目標是將通過http從遠程服務器獲得的映像保存到本地存儲。UWP將BitmapImage轉換爲WriteableBitmap

我讀了這樣的

BitmapImage^ im = ref new BitmapImage(); 
im->CreateOptions = BitmapCreateOptions::IgnoreImageCache; 
im->DownloadProgress += ref new DownloadProgressEventHandler(this, &Capture::ShowDownloadProgress); 
im->ImageOpened += ref new RoutedEventHandler(this, &Capture::ImageDownloaded); 
im->UriSource = ref new Uri(URL); 

ImageDownloaded被觸發我希望能夠將圖像保存爲.jpg文件。我已經擁有對目標文件夾的寫入權限。

我發現了將圖像讀入WriteableBitmap的方法,但構造函數需要寬度和高度......但在獲取圖像之前我不知道這一點。

我可以用什麼方法...
1.以有用的格式獲取圖像數據,以便我可以將其寫入磁盤?
2.在Xaml圖像UIelement中顯示它?
3.提供DownloadProgressImageOpeneddownloaded的回調?

我不能相信這是多麼棘手。

回答

1

WritableBitmap中的「可寫入」是指它是可編輯的(它不是關於是否可寫入磁盤)。

爲了將下載的映像文件寫入磁盤,您不需要BitmapImage或WritableBitmap,只需下載該流並將其直接寫入磁盤即可。然後,您也可以從同一個流創建一個BitmapImage,以便將其顯示在XAML Image元素中。

// download image and write to disk 
Uri uri = new Uri("https://assets.onestore.ms/cdnfiles/external/uhf/long/9a49a7e9d8e881327e81b9eb43dabc01de70a9bb/images/microsoft-gray.png"); 
StorageFile file = await StorageFile.CreateStreamedFileFromUriAsync("microsoft-gray.png", uri, null); 
await file.CopyAsync(ApplicationData.Current.LocalFolder, "microsoft-gray.png", NameCollisionOption.ReplaceExisting); 

// create a bitmapimage and display in XAML 
IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read); 
BitmapImage bitmap = new BitmapImage(); 
await bitmap.SetSourceAsync(stream); 
imageElement.Source = bitmap; 
+0

我看不到一種方式來報告下載CreateStreamedFileFromUriAsync的進度。在圖片較大且用戶連接速度較慢的情況下,這是一個很好的反饋,表明它仍在工作。 – Oliver9523

+0

您也可以使用HttpClient下載流(並觀察進度),然後創建StorageFile:https://docs.microsoft.com/en-us/uwp/api/windows.web.http.httpclient –