C # Windows 8 Store (Metro, WinRT) байтовый массив для BitmapImage
Я работаю над приложением Windows 8 Metro, которое применяет фильтры к изображениям. У меня есть веб-версия приложения и я хочу его портировать. Но, как мы все знаем, WinRT неу всех хороших вещей .NET обеспечивает иначе: /
В настоящее время я применяю фильтры к байтовому массиву и хочу сохранить его таким образом, потому чтосупер быстро! Поэтому в течение последних нескольких дней я искал способы преобразования StorageFile в byte [], а затем byte [] в BitmapImage.
Пока что мне удалось сделать первый (StorageFile to byte []). Вот как я это делаю:
public async Task ImageFileToByteArray(StorageFile file)
{
IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
PixelDataProvider pixelData = await decoder.GetPixelDataAsync();
return pixelData.DetachPixelData();
}
Этот кусок кода возвращаетbyte[]
который содержит данные пикселей как BGRA.
И тут начинается сложная часть. Я не могу успешно преобразовать байтовый массив в BitmapImage. Я искал повсюду, и многие люди предлагают использовать WriteableBitmap, но это нене очень хорошо для меня. Я также нашел несколько частей кода, которые должны работать ... но они нет.
Одно из решений, которое я попробовал, использует InMemoryRandomAccessStream следующим образом:
public async Task ByteArrayToBitmapImage(Byte[] pixels)
{
var stream = new InMemoryRandomAccessStream();
await stream.WriteAsync(pixels.AsBuffer());
stream.Seek(0);
var image = new BitmapImage();
await image.SetSourceAsync(stream);
return image;
}
Этот бросает следующее исключение:
Исключение типа 'System.Exception» произошла в mscorlib.dll, но не была обработана в коде пользователя
Дополнительная информация: Компонент не найден. (Исключение из HRESULT: 0x88982F50)
Я попытался использовать эту строку вместо:
PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
new BitmapTransform(),
ExifOrientationMode.IgnoreExifOrientation,
ColorManagementMode.DoNotColorManage);
Но это не помогло мне, так как я продолжаю получать это исключение.
Я также попробовал это:
var bitmapImage = new BitmapImage();
var pixels = await ImageFileToByteArray(file);
ImageSource imgSource;
using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream())
{
using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0)))
{
writer.WriteBytes(pixels);
await writer.StoreAsync();
}
await bitmapImage.SetSourceAsync(ms);
imgSource = bitmapImage;
}
И получите то же исключение, что и первый кусок кода.
Я также пробовал несколько других способов, которые включают использование обычного потока, а затем преобразование в IRandomAccessStream, но они нетоже не работает.
Весь приведенный выше код кажется мне в порядке. Так что на данный момент я думаю, что проблема вbyte[]
, Я'Я предполагаю, что формат pixelData внутри недопустим, поэтому я попытался изменить его на RGBA, но это не такТ тоже не поможет. Также PixelHeight и PixelWidth объекта BitmapImage равны 0.