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()
afterfileStream.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()
afterfileStream.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);
}
}