在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
相关产品推荐
相关产品推荐

