2 Stimmen

WriteableBitmapEx funktioniert nicht für C#-Metro-Anwendung

Ich habe WriteableBitmapEx für Winrt (Win 8 Metro) heruntergeladen. Ich fügte einen Verweis auf die Dll mit den Erweiterungsmethoden, verwendet sie in meinem Code, alles kompiliert ok.

Das Problem ist, dass die Erweiterungsmethoden keine Wirkung haben. Hier ist ein Teil meines Codes:

WriteableBitmap wb = new WriteableBitmap((int)pictureSize.Width,   (int)pictureSize.Height);
wb.SetSource(fileStream);
var newWB = wb.Flip(FlipMode.Vertical);
ImageControl.Source = newWB;     
newWB.Invalidate(); 

Das Bild wird nicht auf dem Bildschirm angezeigt. Wenn ich jedoch versuche, etwas auf das Bild zu zeichnen, z. B. eine Linie, erscheint das Bild unverändert auf dem Bildschirm.

Ich danke Ihnen!

2voto

Rene Schulte Punkte 2942

Ich vermute, das Bild wurde nicht vollständig geladen, wenn Sie wb.Flip verwenden. IIRC wb.SetSource läuft asynchron.

In der WriteableBitmapEx-Bibliothek gibt es eine weitere Methode namens FromContent. Damit können Sie ein Bild aus dem Inhalt der App laden und die Methode erledigt alles für Sie im Hintergrund.

Das folgende Snippet lädt einfach die Datei logo.png, spiegelt sie und weist die WriteableBitmap einem Bildsteuerelement zu.

var wb = await BitmapFactory.New(1, 1).FromContent(new Uri(BaseUri, @"///assets/logo.png"));
wb = wb.Flip(WriteableBitmapExtensions.FlipMode.Vertical);
Viewport.Source = wb;  

Wenn Sie einen Blick in den Quellcode der WinRT-Version der WriteableBitmapEx.FromContent-Methode werfen, werden Sie sehen, wie ein Stream in die WriteableBitmap umgewandelt wird. Verwenden Sie das folgende Snippet, um ein beliebiges Bildformat IRandomAccessStream in eine WriteableBitmap zu dekodieren:

// Decode image format
var decoder = await BitmapDecoder.CreateAsync(fileStream);
var transform = new BitmapTransform();
var pixelData = await decoder.GetPixelDataAsync(decoder.BitmapPixelFormat, decoder.BitmapAlphaMode, transform, ExifOrientationMode.RespectExifOrientation, ColorManagementMode.ColorManageToSRgb);

// Swap R and B channels since it's reversed
var pixels = pixelData.DetachPixelData();
for (var i = 0; i < pixels.Length; i += 4)
{
    var r = pixels[i];
    var b = pixels[i + 2];
    pixels[i] = b;
    pixels[i + 2] = r;
}

// Copy pixels to WriteableBitmap
var wb = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight);
using (var bmpStream = wb.PixelBuffer.AsStream())
{
    bmpStream.Seek(0, SeekOrigin.Begin);
    bmpStream.Write(pixels, 0, (int)bmpStream.Length);
}

// Your original code
var newWB = wb.Flip(FlipMode.Vertical);
ImageControl.Source = newWB; 

Ja, das ist viel mehr Code als man erwarten würde, vor allem, wenn Sie dies in Silverlight oder WPF vor getan.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X