C # Windows 8 Store (Metro, WinRT) Tablica bajtów do BitmapImage

Pracuję nad aplikacją Metro Windows 8, która stosuje filtry do obrazów. Mam wersję internetową aplikacji i chciałem ją przenieść. Ale jak wszyscy wiemy WinRT nie ma wszystkich dobrych rzeczy. NET zapewnia inaczej: /

Obecnie stosuję filtry w tablicy bajtów i chcę je zachować w ten sposób, ponieważ jest super szybki! Od kilku dni szukam więc sposobów przekonwertowania pliku StorageFile na bajt [], a następnie na bajt [] na BitmapImage.

Do tej pory udało mi się zrobić pierwszy (StorageFile to byte []). Oto jak to robię:

public async Task<Byte[]> 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();
    }

Ten fragment kodu zwraca abyte[] który zawiera dane pikseli jako BGRA.

I tu przychodzi trudna część. Nie mogę pomyślnie przekonwertować tablicy bajtów na BitmapImage. Przeszukałem wszystkie miejsca i wiele osób sugeruje używanie WriteableBitmap, ale to nie robi mi wiele dobrego. Znalazłem również fragmenty kodu, które powinny działać ... ale nie działają.

Jednym z rozwiązań, które próbowałem, jest użycie InMemoryRandomAccessStream w ten sposób:

public async Task<BitmapImage> 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;
    }

Ten zgłasza następujący wyjątek:

Wyjątek typu „System.Exception” wystąpił w mscorlib.dll, ale nie był obsługiwany w kodzie użytkownika

Informacje dodatkowe: Nie można znaleźć komponentu. (Wyjątek od HRESULT: 0x88982F50)

Zamiast tego spróbowałem użyć tej linii:

PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
            BitmapPixelFormat.Bgra8, 
            BitmapAlphaMode.Ignore, 
            new BitmapTransform(),
            ExifOrientationMode.IgnoreExifOrientation, 
            ColorManagementMode.DoNotColorManage);

Ale to nie przyniosło mi korzyści, ponieważ wciąż otrzymuję ten wyjątek.

Próbowałem również tego:

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

I uzyskaj taki sam wyjątek jak pierwszy fragment kodu.

Wypróbowałem też kilka innych sposobów, które obejmują użycie zwykłego strumienia, a następnie przekształcenie w IRandomAccessStream, ale nie działają.

Cały powyższy kod wydaje mi się w porządku. W tej chwili przypuszczam, że problem tkwi w tymbyte[]. Zgaduję, że format danych pixelData wewnątrz nie jest poprawny, więc spróbowałem zmienić go na RGBA, ale to też nie pomogło. Również PixelHeight i PixelWidth BitmapImage wynoszą 0.

questionAnswers(2)

yourAnswerToTheQuestion