C# 创建LiveTile图像-在屏幕上看起来不错-与LiveTile图像一样看起来不好

C# 创建LiveTile图像-在屏幕上看起来不错-与LiveTile图像一样看起来不好,c#,windows-phone-8,win-universal-app,C#,Windows Phone 8,Win Universal App,我正在Windows Universal应用程序的屏幕上绘制一些形状,然后我还试图将基本UIElement保存到一个文件中,并指定我的LiveTile模板来使用它 我想我很接近了,但有些事情很不对劲。以下是它在我的屏幕上的外观: 下面是它在瓷砖上的外观: 第一幅图像中的黑色意味着透明,而活动平铺似乎有很多透明像素(浅灰色是我的背景图像)。我可以看到很多黄色和绿色,因此它似乎正确地创建/查找了文件并更新了live tile模板。在我的Windows Phone上,我就是无法让它看起来像我想要的

我正在Windows Universal应用程序的屏幕上绘制一些形状,然后我还试图将基本UIElement保存到一个文件中,并指定我的LiveTile模板来使用它

我想我很接近了,但有些事情很不对劲。以下是它在我的屏幕上的外观:

下面是它在瓷砖上的外观:

第一幅图像中的黑色意味着透明,而活动平铺似乎有很多透明像素(浅灰色是我的背景图像)。我可以看到很多黄色和绿色,因此它似乎正确地创建/查找了文件并更新了live tile模板。在我的Windows Phone上,我就是无法让它看起来像我想要的那样

然而,在我的Windows10桌面上,它看起来就像我所期望的那样(只是它似乎失去了它的透明度——我对此感到很高兴)

画布是150x150。实时互动程序模板是TileSquare150x150Image。我使用的是一个.png文件。我尝试过更改BitmapPixelFormat,手动设置调用encoder.SetPixelData时要使用的logicalDpi,并使用不同的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();
}

使用
RenderTargetBitmap
渲染控件时,图像会自动按比例缩放(即使在
RenderAsync()
调用中指定了宽度和高度)

因此,应始终使用
RenderTargetBitmap
PixelWidth
PixelHeight
属性来确定渲染图像的实际大小


问题的问题是
options.Size.Width
options.Size.Height
RenderTargetBitmap
中的值不同,因此传递给编码器的像素数据和图像大小不匹配。

您应该调用
SetPixelData()
使用renderBitMap.PixelWidth/Height,而不是从该
选项
变量获得的值。我怀疑他们是一样的
RenderAsync()
根据
DisplayInformation.RawPixelsPerViewPixel
@yasen的值缩放图像-谢谢。这完全解决了我的问题。如果你想把这个作为一个答案,我会接受的。再次感谢!