【问题标题】:OpenSeadragon zoom issuesOpenSeadragon 缩放问题
【发布时间】:2021-07-09 01:53:58
【问题描述】:

我正在尝试学习 openseadragon 缩放功能,但是,有些东西不明白。我整理了一个简单的例子,有几个问题: https://codepen.io/Ivalina/pen/poPbaMv

当页面首次加载时,我如何确保当我立即单击缩小时,图像不会变得比现在更小。这令人困惑,因为我希望它从最小的开始。 (优先级)

另一个问题,我确实设置了最小和最大缩放级别,但是当我继续单击放大时,它肯定超过了 3 次单击。放大后缩小也是如此。有没有办法将缩放限制为特定的点击次数(最好是 3 次)。

var tileSources = {
    Image: {
        xmlns: "http://schemas.microsoft.com/deepzoom/2008",
        Url: "//openseadragon.github.io/example-images/duomo/duomo_files/",
        Format: "jpg",
        TileSize: "256",
        Size: {
            Width:  "13920",
            Height: "10200"
        }
    }
};

var viewer = OpenSeadragon({
    id: "seadragonviewer",
    prefixUrl: "//openseadragon.github.io/openseadragon/images/",
    tileSources: tileSources,
    visibilityRatio: 1.0,
    constrainDuringPan: true,
    minZoomLevel: 0,
    maxZoomLevel: 2,
    zoomPerClick: 1.5,
    gestureSettingsMouse: {
      clickToZoom: false,
      scrollToZoom: false,
      flickEnabled: true
    },
    gestureSettingsTouch: {
      clickToZoom: false
    },
    visibilityRatio: 1.0,
    useCanvas: false
});

【问题讨论】:

  • 自从您提出这个问题以来,您似乎已经更改了 codepen,因为根本没有发生单击缩放?无论如何,我实际上不确定您如何保证它恰好在三下点击。一方面,我相信您必须放大多少才能完全进入取决于查看器的大小……在大型显示器上,您不必像在手机上那样放大。也许让它按照它想要的方式工作会更好?
  • 点击放大和缩小按钮是有效的,我刚试过我的笔。总体而言,要求在单击按钮时不超过 3 次放大或缩小。所以如果可能的话,我需要做的是,无论查看器的大小是多少,我都只能放大 3 个级别。
  • 我想我不明白 maxZoomLevel 是什么意思。我认为这表明您只能点击这么多。有没有办法覆盖这个功能,只设置为 3?

标签: javascript openseadragon


【解决方案1】:

这本身不一定是一个答案,但我需要比评论更多的空间,所以这里是:

OSD“缩放”是基于图像宽度和查看器宽度之间的关系。当图像完全水平填充查看器时为 1。如果放大到足以让查看器只显示图像的一半宽度,则缩放为 2。放大到足以使查看器仅显示四分之一宽度,则缩放为 4。 maxZoomLevel 选项基于那些条款。

默认情况下,您可以放大的最远距离取决于在 maxZoomPixelRatio 选项中指定的图像像素与屏幕像素的比率(默认为 1.1)。换句话说,如果 maxZoomPixelRatio 为 1,那么您只能放大到足以看到图像像素 1:1。正如您所发现的,您可以使用 maxZoomLevel 覆盖它,但是您可以获得的实际像素的接近程度将取决于查看器的大小。

无论如何,如果您想要保证点击 3 次,并且您不在乎与实际像素的距离有多近,那么这里有一个场景:

如果您的图像在水平维度上自然填充查看器,您将获得 1 的起始缩放。如果 zoomPerClick 设置为 2,则在第一次点击时,您的缩放现在将为 2。在第二次点击时,它将为 4(缩放为乘法),第三次缩放为 8。因此,在这种情况下,您应该将 maxZoomLevel 设置为 8。

如果您的图像不是以 1 的缩放开始(因为它足够高,无法填满查看器的宽度),则您必须将 maxZoomLevel 建立在该起始缩放的基础上。如果您有不同的 zoomPerClick,则必须考虑到这一点。

如果您确实关心在第三次点击时可以获得的实际像素有多接近,则需要调整 zoomPerClick 以便每个查看器大小/图像大小比率都不同。

我希望这些额外的背景信息有所帮助!

编辑:这是设置 zoomPerClick 的方法:

您需要知道的是家庭缩放(用户从完全放大图像开始)和完全缩放(当您完全放大以查看图像像素 1:1 时) ),然后你需要弄清楚你必须将家庭缩放乘以 3 倍(因为你想要 3 次点击)才能获得完整的缩放。幸运的是,您可以在加载图像后执行此操作,因此 OpenSeadragon 可以为您完成大部分数学运算。

viewer.addHandler('open', function() {
  const homeZoom = viewer.viewport.getHomeZoom();
  const fullZoom = viewer.viewport.imageToViewportZoom(1);
  viewer.zoomPerClick = Math.cbrt(fullZoom / homeZoom);
});

这段代码我没有测试过,不过应该是基本思路。

【讨论】:

  • 谢谢。这是一个非常好的信息。那么我将如何为每个查看器大小/图像大小比率设置 zoomPerClick。它应该在 openSeadragon 的默认设置中的某个位置。任何语法示例都会有所帮助。谢谢!
  • 好的,我在上面的答案中添加了一些示例代码...希望对您有所帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 2019-05-24
  • 2013-02-12
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多