如何使用Windows.Web.Http下载和存储图像?

时间:2014-11-02 22:15:49

标签: c# windows-phone-8 windows-8 windows-store-apps windows-phone-8.1

如何使用Windows.Web.Http在Windows应用商店应用中从互联网下载和存储jpeg图像?

我面临的问题是,我不知道Get ... Async和Write ...我必须使用异步方法来处理图像吗?它与文件非常不同,而不是字符串。


仅限Windows.Web.Http

没有第三方解决方案

如果您提出其他建议,请使用评论部分,而不是答案。谢谢!


…    
using Windows.Storage;
using Windows.Web.Http;

Uri uri = new Uri("http://image.tmdb.org/t/p/w300/" + posterPath);
HttpClient httpClient = new HttpClient();

// I guess I need to use one of the Get...Async methods?
var image = await httpClient.Get…Async(uri);

StorageFolder localFolder = ApplicationData.Current.LocalFolder;
StorageFolder cachedPostersFolder = await localFolder.CreateFolderAsync("cached posters", CreationCollisionOption.OpenIfExists);

StorageFile posterFile = await cachedPostersFolder.CreateFileAsync(posterPath, CreationCollisionOption.ReplaceExisting);

// I guess I need to use one of the Write...Async methods?
await FileIO.Write…Async(posterFile, image);

3 个答案:

答案 0 :(得分:6)

您可以使用GetBufferAsync方法获取缓冲区,然后调用FileIO.WriteBufferAsync将缓冲区写入文件:

Uri uri = new Uri("http://i.stack.imgur.com/ZfLdV.png?s=128&g=1");
string fileName = "daniel2.png";

StorageFile destinationFile = await KnownFolders.PicturesLibrary.CreateFileAsync(
      fileName, CreationCollisionOption.GenerateUniqueName);


HttpClient client = new HttpClient();

var buffer = await client.GetBufferAsync(uri);
await Windows.Storage.FileIO.WriteBufferAsync(destinationFile, buffer);

答案 1 :(得分:1)

 image1.Source = new BitmapImage(new Uri("http://www.image.com/image.jpg",     UriKind.RelativeOrAbsolute));


       using (var mediaLibrary = new MediaLibrary())
        {
            using (var stream = new MemoryStream())
            {
                var fileName = string.Format("Gs{0}.jpg", Guid.NewGuid());
                bmp.SaveJpeg(stream, bmp.PixelWidth, bmp.PixelHeight, 0, 100);
                stream.Seek(0, SeekOrigin.Begin);
                var picture = mediaLibrary.SavePicture(fileName, stream);
                if (picture.Name.Contains(fileName)) return true;
            }
        }

答案 2 :(得分:1)

这是John的类似答案,但是在WP8.1中你不能使用GetBufferAsync。相反,你可以像我一样使用GetStreamAsync:

Uri uri = new Uri(UriString);
string fileName = p4.IconLocation;

HttpClient client = new HttpClient();

var streamImage = await client.GetStreamAsync(uri);

await SaveToLocalFolderAsync(streamImage, fileName);

使用函数:

public async Task SaveToLocalFolderAsync(Stream file, string fileName)
    {
        StorageFolder localFolder = ApplicationData.Current.LocalFolder;
        StorageFile storageFile = await localFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
        using (Stream outputStream = await storageFile.OpenStreamForWriteAsync())
        {
            await file.CopyToAsync(outputStream);
        }
    }