我下载了WritertBitmapEx for winrt(赢得8地铁)。
我使用扩展方法添加了对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;
如果查看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;
是的,除了esp之外,这比代码更多。如果您之前在Silverlight或WPF中执行过此操作。
关于c# - WriteableBitmapEx不适用于C#Metro应用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10944203/