WinRT Bildbearbeitung

8

Ein Freund und ich verbrachten den größten Teil der letzten Nacht damit, uns fast die Haare auszureißen und versuchten, mit einigen Bildern in einer Metro-App zu arbeiten. Wir haben Bilder mit dem Share-Charme in die App aufgenommen, und dann wollte ich etwas anderes mit ihnen machen, die Bilder zuschneiden und sie in den appdata-Ordner zurückspeichern. Dies erwies sich als äußerst frustrierend.

Meine Frage, am Ende von all dem, wird sein: "Was ist der richtige Weg, dies zu tun, ohne das Gefühl zu haben, dass ich ein paar nicht zusammenpassende Puzzlestücke zusammenhämmere?"

Wenn Sie mehrere Bilder mit der App teilen, werden sie als eine Liste von Windows.Storage.StorageFile s angezeigt. Hier ist ein Code, der dazu verwendet wird.

%Vor%

Bei einer Online-Suche wurde angegeben, dass zur Zeit nur ein Windows.UI.Xaml.Media.Imaging.WriteableBitmap auf die Pixeldaten im Bild zugreifen kann. Diese Frage enthält eine hilfreiche Antwort voller Erweiterungsmethoden zum Speichern von Bildern in einer Datei, die wir verwendet haben diese.

Unsere Probleme waren am schlimmsten, als ich später versuchte, die Dateien wieder zu öffnen. Ich habe etwas Ähnliches wie vorher gemacht:

%Vor%

Hier kommt ein Problem. Wie lang ist dieser Stream, wenn ich die Bytes raus haben möchte?

%Vor%

Ok, versuche es noch einmal.

%Vor%

Dies funktioniert, außer ... wenn das Bild komprimiert ist, ist der Stream kürzer als erwartet, so dass Sie schließlich eine Ausnahmebegrenzung erhalten. Jetzt täuschen Sie vor, es ist eine unkomprimierte Bitmap.

%Vor%

Nun raten Sie mal was. Obwohl ich bitmap.SetSource(fileStream); gesagt habe, um die Daten einzulesen, ist mein Byte-Array immer noch voll von Nullen. Ich habe keine Idee warum. Wenn ich dieselbe bitmap in eine my UI über die Beispieldatengruppe übergebe, wird das Bild einwandfrei angezeigt. Es hat also eindeutig die Pixeldaten in dieser Bitmap irgendwo, aber ich kann es nicht aus bitmap.PixelBuffer lesen? Warum nicht?

Schließlich, hier ist, was am Ende funktioniert hat.

%Vor%

So, jetzt habe ich nach Bilddaten, aber ich habe immer noch ein großes Problem. Um etwas damit zu tun, muss ich Annahmen über sein Format machen. Ich habe keine Ahnung, ob es rgba, rgb, abgr, bgra, was auch immer sie sein können. Wenn ich falsch rate, schlägt meine Verarbeitung fehl. Ich habe Dutzende von Testläufen gehabt, die Nullbyte und beschädigte Bilder, umgedrehte Bilder (???), falsche Farben usw. ausspuckten. Ich hätte erwartet, etwas von dieser Information im properties zu finden, das ich vom Anrufen bekommen habe await file.Properties.GetImagePropertiesAsync(); , aber kein Glück. Das enthält nur die Bildbreite und -höhe sowie einige andere nutzlose Dinge. Minimale Dokumentation hier .

Also, warum ist dieser Prozess so schmerzhaft? Zeigt das gerade die Unreife der Bibliotheken, und kann ich erwarten, dass es besser wird? Oder gibt es bereits eine Standardmethode dafür? Ich wünschte, es wäre so einfach wie in System.Drawing . Das gab Ihnen alle Daten, die Sie jemals brauchten, und hat jeden Bildtyp korrekt geladen, ohne dass Sie selbst mit Streams umgehen mussten.

    
Tesserex 04.04.2012, 15:00
quelle

1 Antwort

2
  1. Von dem, was ich gesehen habe - wenn Sie die WriteableBitmap mit einem Stream laden wollen - müssen Sie die Bilddimensionen nicht überprüfen - machen Sie einfach WriteableBitmap (1,1), dann rufen Sie SetSource () auf.
  2. Nicht sicher, warum Sie var pixel = new byte [fileStream.Length]; würde funktionieren, da der FileStream die komprimierten Bildbytes und kein Pixel-Array hat.
  3. Sie müssen möglicherweise den Anfang des Streams suchen, um das Pixel-Array zu erhalten:

    %Vor%
  4. Ich habe angefangen, an einem WinRT-Port von WriteableBitmapEx zu arbeiten - vielleicht könnte es Ihnen helfen: Ссылка . Ich habe es nicht gut getestet und es basiert auf einer älteren Version von WBX, aber es ist in Bezug auf Feature-Unterstützung ziemlich vollständig. Könnte etwas langsamer sein als es möglich ist.

Filip Skakun 04.04.2012 22:45
quelle