我在Windows通用应用程序的屏幕上绘制了一些图形,然后我也尝试将基本UIElement保存到文件中,并将我的LiveTile模板来使用它。创建LiveTile图像 - 在屏幕上看起来不错 - 看起来不错如LiveTile
我想我很接近,但有些事情是非常错误的。下面是它的外观我的屏幕上:
这里是它的外观上平铺:
第一图像中的黑色,就是要透明,动态磁贴,似乎有很多透明像素(浅灰色是我的背景图像)。我可以看到很多黄色和绿色,所以它似乎正确地创建/查找文件并更新活动切片模板。我无法理解我的意图 - 在我的Windows Phone上。
然而,我的Windows 10桌面上 - 它看起来如何我希望(只有它似乎已经失去了它的透明度 - 这我够着幸福)
画布是150×150。实时拼贴模板是TileSquare150x150Image。我正在使用.png文件。我尝试过改变BitmapPixelFormat,手动设置logicalDpi以在调用encoder.SetPixelData时使用,并使用不同的BitmapAlphaModes ...偶尔会引发异常,否则它会呈现大致相同的效果。
任何人都可以在正确的方向推动我吗?我认为通用应用程序可以确保设备之间的相同行为,所以我非常惊讶地发现它在手机和台式机之间的表现如此不同......但我确信我只是在做一些不正确的事情。我的代码如下所示:
var renderBitMap = new RenderTargetBitmap();
await renderBitMap.RenderAsync(_container);
var pixels = await renderBitMap.GetPixelsAsync();
byte[] myBytes = pixels.ToArray();
var folder = ApplicationData.Current.LocalFolder;
var file = await folder.CreateFileAsync("ts150.png", CreationCollisionOption.ReplaceExisting);
var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)options.Size.Width, (uint)options.Size.Height, logicalDpi, logicalDpi, myBytes);
await encoder.FlushAsync();
}
您应该使用renderBitMap.PixelWidth/Height调用'SetPixelData()',而不是从'option'变量中获得的值。我怀疑他们是一样的。 'RenderAsync()'根据DisplayInformation.RawPixelsPerViewPixel的值缩放图像。 – yasen 2015-03-09 02:15:04
@yasen - 谢谢。这完全解决了我的问题。如果你想发布这个答案 - 我会接受它。再次感谢! – 2015-03-09 08:46:53