WriteableBitmapEx不适用于C#metro应用程序

WriteableBitmapEx不适用于C#metro应用程序,c#,windows-runtime,microsoft-metro,writeablebitmap,writeablebitmapex,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(FlipMo

我下载了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(); 
图像不会出现在屏幕上。 但是,如果我试图在图像上画一些东西,比如一条线,那么图像会在屏幕上显示不变


谢谢大家!

我猜在使用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的。使用以下代码段将任何图像格式的IRandomaccesstream解码为可写Bitmap:

// 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; 
//解码图像格式
var decoder=wait BitmapDecoder.CreateAsync(fileStream);
var transform=新的BitmapTransform();
var pixelData=wait decoder.GetPixelDataAsync(decoder.BitmapPixelFormat,decoder.BitmapAlphaMode,transform,exifororientationmode.respectexifororientation,ColorManagementMode.ColorManageToSRgb);
//交换R和B通道,因为它是反向的
var pixels=pixelData.DetachPixelData();
对于(变量i=0;i

是的,这是一种比任何人都要多的代码,特别是如果你以前在Silverlight或WPF中这样做的话。

你从哪里获得了WinRT版本的库?从她那里:我明天会研究这个问题。-雷内·舒尔特(自由党的作者)。顺便说一句,我不监视StackOverflow的WBX问题,只监视CodePlex站点上的讨论。顺便说一句,我猜当你使用wb.Flip时,图像没有完全加载。IIRC运行wb.SetSource async。这很有效,现在我还学习了如何从应用程序加载图片。但仍然存在的问题是,如何使用FileOpenPicker对IRandomaccesstream中加载的图片执行此操作?我还向lib添加了一个方法,该方法以透明方式处理此问题:FromStream。WriteableBitmapEx新的最终1.0版本将于今晚发布。所以明天就下载lib并使用它。