C # Windows 8 Store (Metro, WinRT) Byte-Array zu BitmapImage

Ich arbeite an einer Windows 8 Metro-App, die Filter auf Bilder anwendet. Ich habe eine Webversion der App und wollte sie portieren. Aber wie wir alle wissen, hat WinRT nicht alle guten Dinge, die .NET sonst bietet: /

Momentan wende ich die Filter auf ein Byte-Array an und ich möchte es so lassen, weil es superschnell ist! In den letzten Tagen habe ich nach Möglichkeiten gesucht, eine Speicherdatei in Byte [] und dann Byte [] in BitmapImage zu konvertieren.

Bisher habe ich es geschafft, den ersten zu machen (StorageFile to Byte []). So mache ich es:

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

Dieser Code gibt a zurückbyte[] das enthält die Pixeldaten als BGRA.

Und hier kommt der schwierige Teil. Ich kann das Byte-Array nicht erfolgreich in ein BitmapImage konvertieren. Ich habe überall gesucht und viele Leute schlagen vor, WriteableBitmap zu verwenden, aber das nützt mir nicht viel. Ich habe auch einige Code-Teile gefunden, die funktionieren sollten ... aber das tun sie nicht.

Eine der Lösungen, die ich ausprobiert habe, ist die Verwendung von InMemoryRandomAccessStream wie folgt:

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

Dieser löst die folgende Ausnahme aus:

In mscorlib.dll ist eine Ausnahme vom Typ "System.Exception" aufgetreten, die jedoch im Benutzercode nicht behandelt wurde

Zusätzliche Informationen: Die Komponente wurde nicht gefunden. (Ausnahme von HRESULT: 0x88982F50)

Ich habe stattdessen versucht, diese Zeile zu verwenden:

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

Aber es hat mir nicht gut getan, da ich immer wieder diese Ausnahme bekomme.

Das habe ich auch probiert:

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

Und erhalten Sie die gleiche Ausnahme wie das erste Stück Code.

Ich habe auch verschiedene andere Möglichkeiten ausprobiert, darunter die Verwendung eines normalen Streams und die Konvertierung in einen IRandomAccessStream, aber sie haben auch nicht funktioniert.

Der gesamte obige Code scheint mir in Ordnung zu sein. Ich vermute im Moment, dass das Problem in derbyte[]. Ich vermute, dass das Format der darin enthaltenen Pixeldaten nicht gültig ist, also habe ich versucht, es in RGBA zu ändern, aber das hat auch nicht geholfen. Auch PixelHeight und PixelWidth des BitmapImage sind 0.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage