You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在OpenSeadragon中更新图片并保留Annotorious标注功能

问题描述

我正在开发一个用Annotorious做区域标注的项目。完成标注点「END TASK」按钮后,页面会跳转到同一项目的下一个任务。现在碰到个问题:加载新图片后没法再标注了,之前本来能在缩放和标注模式之间切换的。

我用Annotorious 2.7.10的viewer.destroy()函数重置图片,但怕这会影响Annotorious和OpenSeadragon的功能。想问下怎么更新图片的同时还能正常标注?

现有代码

OpenSeadragon 初始化代码

var viewer = OpenSeadragon({
    id: "documentopdftranscribir",
    prefixUrl: "/static/img/openseadragon/",
    tileSources: {
        type: "image",
        url: url
    },
    showRotationControl: true, 
    showFlipControl: false,
    constrainDuringPan: true,
    showNavigator: false, 
});

anno = OpenSeadragon.Annotorious(viewer, {
    locale: 'auto',
    crosshair: false,
    drawOnSingleClick: true,
    allowEmpty: true,
    disableEditor: false, 
});

当前重置图片的代码

if(viewer){
  viewer.destroy();
}
解决方案

别直接用viewer.destroy()销毁整个OpenSeadragon实例——这会把绑定在上面的Annotorious也一起销毁,后续再初始化很容易出问题,导致标注功能失效。正确的做法是更新OpenSeadragon的图片源,同时重置Annotorious的标注状态,具体步骤如下:

  • 更新图片源,保留原有实例
    直接调用OpenSeadragon的open()方法加载新图片,不用销毁viewer:
// 传入新图片的URL即可
viewer.open({
    type: "image",
    url: newImageUrl
});
  • 清空旧标注,重置Annotorious
    加载新图后,清空之前的标注数据,确保新图的标注环境是干净的:
// 清空所有已有的标注
anno.setAnnotations([]);
  • 确保标注功能处于启用状态
    如果切换任务后标注模式被意外禁用,手动开启即可:
// 启用标注编辑
anno.setEditorEnabled(true);
// 确保可以绘制标注(如果之前切到了缩放模式)
anno.setDrawingEnabled(true);
  • 完整的任务切换示例代码
// 点击END TASK时执行的逻辑
function switchToNextTask(newImageUrl) {
    // 加载新图片
    viewer.open({
        type: "image",
        url: newImageUrl
    });

    // 清空旧标注
    anno.setAnnotations([]);

    // 恢复标注功能
    anno.setEditorEnabled(true);
    anno.setDrawingEnabled(true);
}

为啥之前的方法不行?

viewer.destroy()会彻底销毁OpenSeadragon的所有实例资源,包括绑定的Annotorious。之后如果重新初始化,很容易出现DOM元素绑定冲突、实例未正确挂载等问题,导致标注功能用不了。而直接更新图片源的方式,保留了原有的viewer和Annotorious实例,避免了重复初始化的坑。

内容的提问来源于stack exchange,提问作者dtejada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:06:27