C# UWP-如何将联系人缩略图保存到本地存储?

C# UWP-如何将联系人缩略图保存到本地存储?,c#,windows-10,uwp,C#,Windows 10,Uwp,我需要一些帮助来获取联系人的缩略图并将其保存到本地存储,我成功获取了联系人缩略图,但无法从流中获取实际图像,这是我的代码: var contactStore = await ContactManager.RequestStoreAsync(); var contacts = await contactStore.FindContactsAsync(); var myContact = contacts[0]; //I am sure that this Contact has a Thumbn

我需要一些帮助来获取联系人的缩略图并将其保存到本地存储,我成功获取了联系人缩略图,但无法从流中获取实际图像,这是我的代码:

var contactStore = await ContactManager.RequestStoreAsync();
var contacts = await contactStore.FindContactsAsync();
var myContact = contacts[0];  //I am sure that this Contact has a Thumbnail

var stream = await myContact.Thumbnail.OpenReadAsync();
byte[] buffer = new byte[stream.Size];
var readBuffer = await stream.ReadAsync(buffer.AsBuffer(), (uint)buffer.Length, InputStreamOptions.None);

var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("image.jpg", CreationCollisionOption.ReplaceExisting);
var fileStream = await file.OpenStreamForWriteAsync();
await fileStream.WriteAsync(readBuffer.ToArray(), 0, (int)readBuffer.Length);
这段代码在本地存储器中创建一个空映像,有什么帮助吗


感谢您抽出时间

我相信您可能需要在读取流后调用stream.Dispose(),或者使用using指令初始化流:
using(var outputStream=stream.getoutputstreeamat(0))

以下链接可能有用:

我相信您可能必须在读取流之后调用stream.Dispose(),或者使用using指令初始化流:
using(var outputStream=stream.getoutputstreeamat(0))

以下链接可能有用:

这里的问题是您没有将缓冲区刷新到底层流。您可以添加
fileStream.Flush()
after
fileStream.WriteAsync
方法来解决您的问题

除此之外,我们还需要在使用完流后调用以释放流所使用的资源。此方法通过将任何更改写入备份存储并关闭流以释放资源来处理流。所以我们可以在
fileStream.WriteAsync
方法之后使用
fileStream.Dispose()

调用
Dispose
方法的推荐方法是使用C#using语句,如下所示:

var contactStore = await ContactManager.RequestStoreAsync();
var contacts = await contactStore.FindContactsAsync();
var myContact = contacts[0];  //I am sure that this Contact has a Thumbnail

using (var stream = await myContact.Thumbnail.OpenReadAsync())
{
    byte[] buffer = new byte[stream.Size];
    var readBuffer = await stream.ReadAsync(buffer.AsBuffer(), (uint)buffer.Length, InputStreamOptions.None);

    var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("image.jpg", CreationCollisionOption.ReplaceExisting);
    using (var fileStream = await file.OpenStreamForWriteAsync())
    {
        await fileStream.WriteAsync(readBuffer.ToArray(), 0, (int)readBuffer.Length);
    }
}

这里的问题是您没有将缓冲区刷新到底层流。您可以添加
fileStream.Flush()
after
fileStream.WriteAsync
方法来解决您的问题

除此之外,我们还需要在使用完流后调用以释放流所使用的资源。此方法通过将任何更改写入备份存储并关闭流以释放资源来处理流。所以我们可以在
fileStream.WriteAsync
方法之后使用
fileStream.Dispose()

调用
Dispose
方法的推荐方法是使用C#using语句,如下所示:

var contactStore = await ContactManager.RequestStoreAsync();
var contacts = await contactStore.FindContactsAsync();
var myContact = contacts[0];  //I am sure that this Contact has a Thumbnail

using (var stream = await myContact.Thumbnail.OpenReadAsync())
{
    byte[] buffer = new byte[stream.Size];
    var readBuffer = await stream.ReadAsync(buffer.AsBuffer(), (uint)buffer.Length, InputStreamOptions.None);

    var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("image.jpg", CreationCollisionOption.ReplaceExisting);
    using (var fileStream = await file.OpenStreamForWriteAsync())
    {
        await fileStream.WriteAsync(readBuffer.ToArray(), 0, (int)readBuffer.Length);
    }
}