如何在独立存储中保存 Web 中的图像
本文关键字:保存 Web 图像 存储 独立 | 更新日期: 2023-09-27 18:33:01
在我的应用程序中,我有图像的URL列表。我需要做的是下载这些图像并将它们保存在独立存储中。
我已经拥有的:
using (IsolatedStorageFile localFile = IsolatedStorageFile.GetUserStoreForApplication()) {
...
foreach (var item in MyList)
{
Uri uri = new Uri(item.url, UriKind.Absolute);
BitmapImage bitmap = new BitmapImage(uri);
WriteableBitmap wb = new WriteableBitmap(bitmap);
using (IsolatedStorageFileStream fs = localFile.CreateFile(GetFileName(item.url)))//escape file name
{
wb.SaveJpeg(fs, wb.PixelWidth, wb.PixelHeight, 0, 85);
}
}
...
}
这段代码在我的App.xaml.cs
文件中有它的内部函数。我已经尝试了很多解决方案,在这个解决方案中,问题是"无效的跨线程访问"。
我怎样才能让它工作?
如果在非 UI 线程上创建WriteableBitmap
,则会获得无效的跨线程访问。通过使用Dispatcher
确保该代码在主线程上运行:
Deployment.Current.Dispatcher.BeginInvoke(() =>
// ...
);
此问题的解决方案是:
foreach (var item in MyList)
{
Uri uri = new Uri(item.url, UriKind.Absolute);
HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
request.BeginGetResponse((ar) =>
{
var response = request.EndGetResponse(ar);
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
using (var stream = response.GetResponseStream())
{
var name = GetFileName(item.url);
if (localFile.FileExists(name))
{
localFile.DeleteFile(name);
}
using (IsolatedStorageFileStream fs = localFile.CreateFile(name))
{
stream.CopyTo(fs);
}
}
});
}, null);
}
@Mateusz Rogulski
您应该使用WebClient,我建议您遵循针对您的问题的解决方案。
public string YourMethod(string yoursUri)
{
BitmapImage image=new BitmapImage();
WebClient client = new WebClient();
client.OpenReadCompleted += async (o, args) =>
{
Stream stream = new MemoryStream();
await args.Result.CopyToAsync(stream);
image.SetSource(stream);
};
client.OpenReadAsync(new Uri(yoursUri));//if passing object than you can write myObj.yoursUri
return image;
}
现在您有了图像,您可以在调用此函数的任何地方使用有效检查保存到隔离存储中