WriteableBitmapEx不适用于C#metro app

时间:2012-06-08 06:46:05

标签: c# windows-runtime microsoft-metro writeablebitmap writeablebitmapex

我为winrt(win 8 metro)下载了WriteableBitmapEx。 我用扩展方法添加了对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(); 

图像未出现在屏幕上。 但是如果我尝试在图像上画一些东西,比如一条线,图像就会在屏幕上不变地显示出来。

谢谢你!

1 个答案:

答案 0 :(得分:2)

我猜你使用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;  

如果查看WriteableBitmapEx.FromContent方法的WinRT版本的源代码,您将看到如何将流转换为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中这样做过。