WriteableBitmapEx не работает для приложения метро С#

Я скачал WriteableBitmapEx для winrt (win 8 metro). Я добавил ссылку на dll с методами расширения, использовал их в своем коде, все компилируется нормально.

Проблема в том, что методы расширения не действуют. Вот часть моего кода:

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

Изображение не появляется на экране. Но если я попытаюсь нарисовать что-то на изображении, например, линию, изображение появится на экране без изменений.

Спасибо!


person angela d    schedule 08.06.2012    source источник
comment
Откуда вы взяли WinRT-версию библиотеки?   -  person Filip Skakun    schedule 10.06.2012
comment
от нее: writeablebitmapex.codeplex.com/releases/view/39577   -  person angela d    schedule 11.06.2012
comment
Я посмотрю на это завтра. - Рене Шульте (автор библиотеки). Кстати, я не отслеживаю StackOverflow на предмет вопросов WBX, а только обсуждения на сайте CodePlex.   -  person Rene Schulte    schedule 12.06.2012
comment
Кстати, я думаю, что изображение не было загружено полностью, когда вы используете wb.Flip. IIRC запускает wb.SetSource асинхронно.   -  person Rene Schulte    schedule 12.06.2012


Ответы (1)


Я предполагаю, что изображение не было загружено полностью, когда вы используете 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
comment
это работает, и теперь я также узнал, как загружать изображения из приложения. Но остается проблема, как это сделать для изображения, загруженного в IRandomAccessStream с помощью FileOpenPicker? - person angela d; 13.06.2012
comment
Я также добавил в библиотеку метод, который обрабатывает это прозрачным образом: FromStream. Сегодня вечером будет выпущен новый окончательный выпуск WriteableBitmapEx 1.0. Так что просто скачайте lib завтра и используйте это. - person Rene Schulte; 13.06.2012