簡體   English   中英

如何使ScrollViewer放大以查看單個像素?

[英]How to get a ScrollViewer to zoom in to see individual pixels?

我正在為Windows 8.1開發一個應用程序,在該應用程序中能夠放大和詳細檢查圖像很重要。 如果我只是打開位圖並放大它的樣子。

可以看到像素

但是,當我將圖像加載到應用程序中並使用ScrollViewer進行放大時,我得到了。

像素模糊

似乎正在嘗試插值像素值以進行某種抗鋸齒。

如何獲得它,以便在放大時顯示(盡可能)顯示圖像的確切像素? 特別是,我將圖像用作滾動查看器中包含的畫布的背景。


我環顧了這里和MSDN,發現了兩個相關的問題,但是到目前為止,它們似乎還沒有解決我的確切問題。

沒有簡單的方法可以解決此問題,最好的選擇是使用DirectX渲染更大的圖像,以便減輕WinRT自動插值像素值的影響。

正如有人在MSDN解釋並基於此未解決的請求,我看不到任何其他方法可以實現此目的。

使用Win2D

Win2D是WinRT的DirectX互操作庫。 這樣,您可以以更大的尺寸渲染圖像,然后將scrollViewier的默認縮放級別設置為很小。 因此,放大時似乎可以看到單個像素而沒有任何模糊/模糊插值,因為實際上您將看到一組64個像素左右的所有顏色。 我找不到任何方法來實際覆蓋完成哪種插值,所以這似乎是最好的方法。

  1. 使用Visual Studio將Win2D下載為NuGet軟件包,Win2D的快速入門指南很好地解釋了一些設置
  2. 設置您的畫布和draw事件,並使用DrawImage函數將圖像放大

     <ScrollViewer x:Name="Scroller" ZoomMode="Enabled" MinZoomFactor="0.1" MaxZoomFactor="20"> <canvas:CanvasControl x:Name="canvas" Draw="canvas_Draw" CreateResources="create"/> </ScrollViewer> 

在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的默認縮放比例設置為適當的值,以使圖像看起來大小相同。

在頁面構造函數中

Scroller.ZoomToFactor (0.1f);

我觀察到的其他無效方法

  • 使畫布非常大,並使用BitmapEncoder / BitmapDecoder(將插值模式設置為NearestNeighbor),即使將其縮放為2的冪,也會引入很多視覺偽像
  • 渲染選項僅在WPF中可用,而在WinRT中不可用

也可以使用某些圖像處理庫來簡單地將位圖放大10倍左右,然后再使用它,但最終我還是使用Win2D。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM