Windows phone 8 Windows Phone 8.1上位图的像素精确渲染

Windows phone 8 Windows Phone 8.1上位图的像素精确渲染,windows-phone-8,windows-phone-8.1,Windows Phone 8,Windows Phone 8.1,我的应用程序显示固定宽度和长度的位图(贴图分幅)。它们覆盖了整个屏幕,我逐像素滚动地图。 我有两个版本的应用程序,8.0 Silverlight(容器是画布,地图片是图像)和8.1 Store(使用Win2d库,但也测试了XAML) 当我在Lumia 820(480x800)上运行8.0版应用程序时,ScaleFactor是100,一切都很清晰,屏幕也完全覆盖。然而,当我在720p emulator上运行它时,或者在Lumia上运行8.1版(我认为RawPixelPerViewPixel>1.0

我的应用程序显示固定宽度和长度的位图(贴图分幅)。它们覆盖了整个屏幕,我逐像素滚动地图。 我有两个版本的应用程序,8.0 Silverlight(容器是画布,地图片是图像)和8.1 Store(使用Win2d库,但也测试了XAML)

当我在Lumia 820(480x800)上运行8.0版应用程序时,ScaleFactor是100,一切都很清晰,屏幕也完全覆盖。然而,当我在720p emulator上运行它时,或者在Lumia上运行8.1版(我认为RawPixelPerViewPixel>1.0,1.2)或在任何模拟器上运行时,都会出现问题

图像模糊-我知道应用程序是缩放的,似乎我无能为力,但我的应用程序更大的问题是,当我滚动地图时,瓷砖没有覆盖主面板,大多数时候它们之间有一些空间,我可以看到面板背景(屏幕截图中的红色),只有每5次地图滚动一次(对于RawPixelPerViewPixel=1.2)瓷砖彼此完全相邻,背景完全覆盖

我使用整数在屏幕上定位分幅,例如,对于分幅240x320,我首先在0,0处放置,然后在240,0处放置,等等。如何消除分幅之间的间距?我是否应该将坐标从int切换到float,并以某种方式使用ScaleFactor更精确地计算位置?谢谢


所以我刚刚发现,为了避免那些亚像素伪影线,即通过渲染位图之间的亚像素空间显示的面板(在我的例子中是画布),位图屏幕坐标必须是(1.0/RawPixelsPerViewPixel)的倍数.

WPF视图有两个属性通常可以解决此类问题,一个是SnapsToDevicePixels=“True”,另一个是UseLayoutRounding=“True”。我用过一次,所以我不记得它们是如何工作的,但如果你稍微玩一下,你应该能够解决你的问题。当然,你看到了自动缩放的效果。对于手机,它是100%、140%或180%,这取决于屏幕分辨率。这并不能解释瓷砖的问题,用240像素乘以1.4或更高的分辨率1.8产生一个整数。但是如果你使用(0,0)和(239,0)那么你肯定做错了,那是1。我们看不到你的代码。请阅读提示。@Hans Passant嗨,很抱歉239,0是错误的,当然是240,0。我制作了一个简单的应用程序,只需在画布上放置两个地图块,每次按下指针,它就会将图像向左移动1像素。效果是可复制的。[XAML:
code:
void canvas_PointerPressed(对象发送方,pointErroroutedEventArgs e){foreach(canvas.Children.OfType()中的图像i){canvas.SetLeft(i,canvas.GetLeft(i)-1);}
我刚刚发现,当我将图像移动不是1像素而是1.0/RawPixelsPerViewPixel时,在滚动过程中从来没有任何视觉伪影。因此,似乎我必须在计算图像坐标时使用缩放因子。