首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# metro应用程序无法使用WriteableBitmapEx

C# metro应用程序无法使用WriteableBitmapEx
EN

Stack Overflow用户
提问于 2012-06-08 14:46:05
回答 1查看 2.9K关注 0票数 2

我下载了winrt的WriteableBitmapEx (Win8metro)。我用扩展方法添加了对dll的引用,并在我的代码中使用了它们,一切都可以正常编译。

问题是扩展方法没有效果。下面是我的代码的一部分:

代码语言:javascript
复制
WriteableBitmap wb = new WriteableBitmap((int)pictureSize.Width,   (int)pictureSize.Height);
wb.SetSource(fileStream);
var newWB = wb.Flip(FlipMode.Vertical);
ImageControl.Source = newWB;     
newWB.Invalidate(); 

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-13 02:44:49

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

在WriteableBitmapEx库中还有另一个名为FromContent的方法。这样,您就可以从应用程序的内容中加载一个图像,该方法将在后台为您处理所有事情。

下面的代码片段只是加载logo.png,翻转它,并将WriteableBitmap分配给一个图像控件。

代码语言:javascript
复制
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:

代码语言:javascript
复制
// 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中执行此操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10944203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档