2015-03-08 80 views
0

我在Windows通用应用程序的屏幕上绘制了一些图形,然后我也尝试将基本UIElement保存到文件中,并将我的LiveTile模板来使用它。创建LiveTile图像 - 在屏幕上看起来不错 - 看起来不错如LiveTile

我想我很接近,但有些事情是非常错误的。下面是它的外观我的屏幕上: How it appears on screen

这里是它的外观上平铺:

How it appears on start screen

第一图像中的黑色,就是要透明,动态磁贴,似乎有很多透明像素(浅灰色是我的背景图像)。我可以看到很多黄色和绿色,所以它似乎正确地创建/查找文件并更新活动切片模板。我无法理解我的意图 - 在我的Windows Phone上。

然而,我的Windows 10桌面上 - 它看起来如何我希望(只有它似乎已经失去了它的透明度 - 这我够着幸福) On my desktop

画布是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(); 
} 
+2

您应该使用renderBitMap.PixelWidth/Height调用'SetPixelData()',而不是从'option'变量中获得的值。我怀疑他们是一样的。 'RenderAsync()'根据DisplayInformation.RawPixelsPerViewPixel的值缩放图像。 – yasen 2015-03-09 02:15:04

+0

@yasen - 谢谢。这完全解决了我的问题。如果你想发布这个答案 - 我会接受它。再次感谢! – 2015-03-09 08:46:53

回答

2

当你使用渲染一个RenderTargetBitmap控制,图像自动DisplayInformation.RawPixelsPerViewPixel(即使您指定的宽度和高度在RenderAsync()调用)缩放。

因此,您应始终使用RenderTargetBitmapPixelWidthPixelHeight属性来确定所呈现图像的实际大小。

在提问的问题是,options.Size.Widthoptions.Size.Height是不一样从RenderTargetBitmap的值,因此像素数据并传递给编码器的图像的尺寸不匹配。

相关问题