Я предполагаю, что изображение не было загружено полностью, когда вы используете wb.Flip. IIRC wb.SetSource работает асинхронно.
В библиотеке WriteableBitmapEx есть еще один метод, который называется FromContent. При этом вы можете загрузить изображение из содержимого приложения, и метод обрабатывает все для вас в фоновом режиме.
Приведенный ниже фрагмент просто загружает logo.png, переворачивает его и назначает WriteableBitmap элементу управления изображением.
var wb = await BitmapFactory.New(1, 1).FromContent(new Uri(BaseUri, @"///assets/logo.png"));
wb = wb.Flip(WriteableBitmapExtensions.FlipMode.Vertical);
Viewport.Source = wb;
Если вы посмотрите на исходный код WinRT-версии метода WriteableBitmapEx.FromContent, вы увидите, как поток преобразуется в WriteableBitmap. Используйте приведенный ниже фрагмент для декодирования любого формата изображения IRandomAccessStream в WriteableBitmap:
// 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;
Да, это намного больше кода, чем можно было бы, за исключением, особенно. если вы делали это в Silverlight или WPF раньше.
person
Rene Schulte
schedule
12.06.2012