【问题标题】:WriteableBitmapEx not working for C# metro appWriteableBitmapEx 不适用于 C# Metro 应用程序
【发布时间】:2012-06-08 06:46:05
【问题描述】:

我为 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(); 

图像没有出现在屏幕上。 但是如果我尝试在图像上画一些东西,比如一条线,图像就会原封不动地出现在屏幕上。

谢谢!

【问题讨论】:

  • 您从哪里获得 WinRT 版本的库?
  • 我明天会调查这个。 - Rene Schulte(lib 的作者)。顺便说一句,我不关注 StackOverflow 的 WBX 问题,只关注 CodePlex 网站上的讨论。
  • 顺便说一句,我猜你使用 wb.Flip 时图像没有完全加载。 IIRC 运行 wb.SetSource 异步。

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


【解决方案1】:

我猜当您使用 wb.Flip 时图像没有完全加载。 IIRC wb.SetSource 异步运行。

WriteableBitmapEx 库中还有另一种可用的方法,称为 FromContent。有了它,您可以从应用程序的内容中加载图像,并且该方法会在后台为您处理所有内容。

下面的 sn-p 只是加载 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。使用下面的 sn-p 将任何图像格式 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 中这样做过。

【讨论】:

  • 这行得通,现在我还学习了如何从应用程序加载图片。但剩下的问题是如何使用 FileOpenPicker 对加载到 IRandomAccessStream 中的图片执行此操作?
  • 我还在库中添加了一个以透明方式处理此问题的方法:FromStream。 WriteableBitmapEx 的新最终 1.0 版本将于今晚发布。所以明天就下载 lib 并使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多