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.

Ответы на вопрос(2)

Ваш ответ на вопрос