2016-06-11 1 views
1

я хочу некоторую помощь, чтобы получить миниатюрное изображение Контакта и сохранить его в Local Storage, я успешно получил контакт миниатюры, но я не могу получить реальное изображение из потока, это мой код:UWP - Как сохранить контактную миниатюру для локального хранилища?

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); 

Этот код создает пустое изображение в локальном хранилище, любую помощь?

спасибо за ваше время

ответ

2

Проблема заключается в том, что вы пропустили Stream.Flush method, чтобы сбросить буфер в базовый поток. Вы можете добавить fileStream.Flush(); после fileStream.WriteAsync, чтобы исправить вашу проблему.

Кроме этого, нам также необходимо позвонить Stream.Dispose Method, чтобы освободить ресурсы, используемые Stream, когда мы закончим использовать его. И этот метод распределяет поток, записывая любые изменения в хранилище резервных копий и закрывая поток для освобождения ресурсов. Поэтому мы можем использовать fileStream.Dispose() после метода fileStream.WriteAsync.

рекомендовать способ вызова метода Dispose использует C# используя заявление, как следующее:

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); 
    } 
} 
+0

Отлично работает просто отлично, спасибо – MohamedMokhtar

2

Я считаю, что вы можете позвонить stream.Dispose() после того, как вы читаете из него, либо инициализировать поток с помощью директивы: using (var outputStream = stream.GetOutputStreamAt(0))

Следующая ссылка может быть полезной : https://msdn.microsoft.com/en-us/windows/uwp/files/quickstart-reading-and-writing-files?f=255&MSPPError=-2147217396

Смежные вопросы