В WPF/Metro/Silverlight изображение является элементом управления пользовательского интерфейса. Его источник установлен в BitmapSource. BitmapSource - это структура данных для хранения данных изображения.
Ниже приведен код для извлечения BitmapImage из массива байтов.
public BitmapImage ImageFromBuffer(Byte[] bytes)
{
MemoryStream stream = new MemoryStream(bytes);
BitmapImage image = new BitmapImage();
image.SetSource (stream.AsRandomAccessStream());
return image;
}
Обратите внимание, что stream.AsRandomAccessStream недоступен в API. Это метод расширения. Я нашел его от ответа IDWMaster к этому SO question
Ниже приводится код для метода расширения
public static class MicrosoftStreamExtensions
{
public static IRandomAccessStream AsRandomAccessStream(this Stream stream)
{
return new RandomStream(stream);
}
}
class RandomStream : IRandomAccessStream
{
Stream internstream;
public RandomStream(Stream underlyingstream)
{
internstream = underlyingstream;
}
public IInputStream GetInputStreamAt(ulong position)
{
internstream.Position = (long)position;
return internstream.AsInputStream();
}
public IOutputStream GetOutputStreamAt(ulong position)
{
internstream.Position = (long)position;
return internstream.AsOutputStream();
}
public ulong Size
{
get
{
return (ulong)internstream.Length;
}
set
{
internstream.SetLength((long)value);
}
}
public bool CanRead
{
get { return internstream.CanRead; }
}
public bool CanWrite
{
get { return internstream.CanWrite; }
}
public IRandomAccessStream CloneStream()
{
//HACK, this is not clone, proper implementation is required, returned object will share same internal stream
return new RandomStream(this.internstream);
}
public ulong Position
{
get { return (ulong)internstream.Position; }
}
public void Seek(ulong position)
{
internstream.Seek((long)position, SeekOrigin.Current);
}
public void Dispose()
{
internstream.Dispose();
}
public Windows.Foundation.IAsyncOperationWithProgress<IBuffer, uint> ReadAsync(IBuffer buffer, uint count, InputStreamOptions options)
{
throw new NotImplementedException();
}
public Windows.Foundation.IAsyncOperation<bool> FlushAsync()
{
throw new NotImplementedException();
}
public Windows.Foundation.IAsyncOperationWithProgress<uint, uint> WriteAsync(IBuffer buffer)
{
throw new NotImplementedException();
}
}
Последние 3 методы не реализованы
Я не проверял, но выше, должны работать в принципе (может после некоторой доработки).
Я помещаю обновленный код, просто нажал кнопку «РеализацияИнтерфейс» и предоставил значения по умолчанию. Код компилируется и работает. вы можете поделиться образцовыми данными, чтобы я мог проверить результат. – Tilak
обновлен, возьмите новый код RandomStream – Tilak
Спасибо всем, что помогло мне – mahamed