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.