Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何让ScrollViewer放大以查看单个像素?_C#_Image_Canvas_Windows Runtime_Pixel - Fatal编程技术网

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

C# 如何让ScrollViewer放大以查看单个像素?,c#,image,canvas,windows-runtime,pixel,C#,Image,Canvas,Windows Runtime,Pixel,我正在为Windows8.1制作一个应用程序,在这个应用程序中,能够放大并详细检查图像是很重要的。如果我打开位图并放大它看起来像 然而,当我将图像加载到我的应用程序中并使用ScrollViewer放大时,我得到了一张图片 因为它似乎试图插值像素值以进行某种抗锯齿 我怎样才能得到它,以便当我放大它时(尽可能地)显示图像的精确像素?特别是,我将图像用作包含在滚动查看器中的画布的背景 我环顾了一下这里和MSDN,发现了两个相关的问题,但它们似乎还没有解决我的确切问题 要做到这一点并不

我正在为Windows8.1制作一个应用程序,在这个应用程序中,能够放大并详细检查图像是很重要的。如果我打开位图并放大它看起来像

然而,当我将图像加载到我的应用程序中并使用ScrollViewer放大时,我得到了一张图片

因为它似乎试图插值像素值以进行某种抗锯齿

我怎样才能得到它,以便当我放大它时(尽可能地)显示图像的精确像素?特别是,我将图像用作包含在滚动查看器中的画布的背景


我环顾了一下这里和MSDN,发现了两个相关的问题,但它们似乎还没有解决我的确切问题


要做到这一点并不容易,最好的选择是使用DirectX将图像渲染得更大,这样可以减轻WinRT自动插值像素值的影响

基于这一点,我看不到任何其他方法来实现这一点

使用Win2D 是用于WinRT的DirectX互操作库。使用此选项,您可以以更大的尺寸渲染图像,然后将ScrollViewer的默认缩放级别设置为非常小。因此,当您放大时,您似乎可以看到单个像素,而无需任何模糊/模糊插值,因为实际上您将看到64个像素的组,或者所有像素都是一种颜色。我找不到任何方法来覆盖所做的插值类型,所以这似乎是最好的方法

  • 使用Win2D的Visual Studio将Win2D作为NuGet软件包下载 《快速入门指南》很好地解释了一些设置
  • 设置画布和绘制事件,并使用该函数将图像渲染得更大

    <ScrollViewer x:Name="Scroller" ZoomMode="Enabled"
          MinZoomFactor="0.1" MaxZoomFactor="20">
        <canvas:CanvasControl x:Name="canvas" Draw="canvas_Draw" CreateResources="create"/>
    </ScrollViewer>
    
  • 确保将画布设置为更大
  • 在“代码隐藏”中,将ScrollVieiwer的默认缩放设置为适当,以便图像显示为相同大小
  • 在页面构造函数中

    Scroller.ZoomToFactor (0.1f);
    
    我研究过但不起作用的其他方法

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

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

    我正在寻找Win2D并使用DirectX处理图像,但还没有找到一个可行的解决方案。我发现使用Win2D将图像渲染为10倍大小,然后简单地将scrollViewer的初始zoomfactor设置为0.1,这有点麻烦,但可能是最实际的修复方法。我想看看我是否可以不用Win2D完成这项工作。
    Scroller.ZoomToFactor (0.1f);