如何让ScrollViewer放大以查看单个像素?

时间:2015-09-28 21:01:12

标签: c# image canvas windows-runtime pixel

我正在制作适用于Windows 8.1的应用,其中重要的是能够放大并详细检查图像。如果我只是打开位图并放大它看起来像。

Can see the pixels

然而,当我将图像加载到我的应用程序并使用ScrollViewer进行放大时,我得到了。

Pixels are fuzzy

因为它似乎试图为某种抗锯齿插入像素值。

我如何才能获得它,以便在我放大时显示(尽可能)图像的确切像素?特别是我使用图像作为滚动查看器中包含的画布的背景。

我在这里和MSDN环顾四周,发现了一对相关的问题,但是他们似乎还没有解决我的确切问题。

1 个答案:

答案 0 :(得分:1)

没有简单的方法可以解决这个问题,最好的选择是使用DirectX渲染图像,以便减轻WinRT自动插值像素值的影响。

作为someone explained on MSDN并基于此outstanding request,我无法通过其他方式来实现此目标。

使用Win2D

Win2D是WinRT的DirectX inter-op库。使用此功能,您可以以更大的尺寸渲染图像,然后将scrollViewier的默认缩放级别设置得非常小。因此,当你放大它时,你可以看到没有任何模糊/模糊插值的单个像素,因为你实际上会看到64像素左右的组都是一种颜色。我无法找到任何方法来实际覆盖什么样的插值,所以这似乎是最好的方法。

  1. 使用Visual Studio,Win2D&#39>将Win2D下载为NuGet包 快速入门指南很好地解释了一些设置
  2. 设置画布和绘图事件,并使用DrawImage函数将图像渲染得更大

    <ScrollViewer x:Name="Scroller" ZoomMode="Enabled"
          MinZoomFactor="0.1" MaxZoomFactor="20">
        <canvas:CanvasControl x:Name="canvas" Draw="canvas_Draw" CreateResources="create"/>
    </ScrollViewer>
    
  3. 在canvas_draw函数中。

    canvas.Width = original.Width * 10;
    canvas.Height = original.Height * 10;
    args.DrawingSession.DrawImage(bitmap,new Rect(0,0,original.Width*10,original.Height*10), new Rect(0,0,original.Width,original.Height), 1.0f, CanvasImageInterpolation.NearestNeighbor);
    
    1. 确保将画布设置得更大
    2. 在您的代码后面设置适当的ScrollVieiwer的默认缩放,以使您的图像看起来大小相同。
    3. 在页面构造函数中

      Scroller.ZoomToFactor (0.1f);
      

      我看到并且没有工作的其他方式

      • 使画布非常大并使用BitmapEncoder / BitmapDecoder并将插值模式设置为NearestNeighbor,即使缩放到2大小的力量,也会引入大量视觉瑕疵
      • 渲染选项似乎仅在WPF中可用,而不是在WinRT

      也可以使用一些图像处理库来简单地将位图大约10倍左右然后使用它,但我最终使用的是Win2D。