med-viewer-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +253 -0
- package/dist/adapters/vue/MedViewer.d.ts +17 -0
- package/dist/adapters/vue/index.d.ts +2 -0
- package/dist/core/AnnoAnnotator.d.ts +15 -0
- package/dist/core/BaseAnnotator.d.ts +33 -0
- package/dist/core/ColorAdjustPlugin.d.ts +29 -0
- package/dist/core/Coords.d.ts +6 -0
- package/dist/core/Engine.d.ts +57 -0
- package/dist/core/KonvaAnnotator.d.ts +36 -0
- package/dist/core/Scalebar.d.ts +42 -0
- package/dist/core/SelectionPlugin.d.ts +102 -0
- package/dist/core/Toolbar.d.ts +32 -0
- package/dist/med-viewer-sdk.d.ts +6 -0
- package/dist/med-viewer-sdk.mjs +14248 -0
- package/dist/med-viewer-sdk.umd.js +2 -0
- package/dist/style.css +1 -0
- package/package.json +34 -0
- package/src/adapters/vue/MedViewer.ts +37 -0
- package/src/adapters/vue/index.ts +4 -0
- package/src/assets/icons/button_grouphover.png +0 -0
- package/src/assets/icons/button_hover.png +0 -0
- package/src/assets/icons/button_pressed.png +0 -0
- package/src/assets/icons/button_rest.png +0 -0
- package/src/assets/icons/flip_grouphover.png +0 -0
- package/src/assets/icons/flip_hover.png +0 -0
- package/src/assets/icons/flip_pressed.png +0 -0
- package/src/assets/icons/flip_rest.png +0 -0
- package/src/assets/icons/fullpage_grouphover.png +0 -0
- package/src/assets/icons/fullpage_hover.png +0 -0
- package/src/assets/icons/fullpage_pressed.png +0 -0
- package/src/assets/icons/fullpage_rest.png +0 -0
- package/src/assets/icons/home_grouphover.png +0 -0
- package/src/assets/icons/home_hover.png +0 -0
- package/src/assets/icons/home_pressed.png +0 -0
- package/src/assets/icons/home_rest.png +0 -0
- package/src/assets/icons/next_grouphover.png +0 -0
- package/src/assets/icons/next_hover.png +0 -0
- package/src/assets/icons/next_pressed.png +0 -0
- package/src/assets/icons/next_rest.png +0 -0
- package/src/assets/icons/previous_grouphover.png +0 -0
- package/src/assets/icons/previous_hover.png +0 -0
- package/src/assets/icons/previous_pressed.png +0 -0
- package/src/assets/icons/previous_rest.png +0 -0
- package/src/assets/icons/rotateleft_grouphover.png +0 -0
- package/src/assets/icons/rotateleft_hover.png +0 -0
- package/src/assets/icons/rotateleft_pressed.png +0 -0
- package/src/assets/icons/rotateleft_rest.png +0 -0
- package/src/assets/icons/rotateright_grouphover.png +0 -0
- package/src/assets/icons/rotateright_hover.png +0 -0
- package/src/assets/icons/rotateright_pressed.png +0 -0
- package/src/assets/icons/rotateright_rest.png +0 -0
- package/src/assets/icons/selection_cancel_grouphover.png +0 -0
- package/src/assets/icons/selection_cancel_hover.png +0 -0
- package/src/assets/icons/selection_cancel_pressed.png +0 -0
- package/src/assets/icons/selection_cancel_rest.png +0 -0
- package/src/assets/icons/selection_confirm_grouphover.png +0 -0
- package/src/assets/icons/selection_confirm_hover.png +0 -0
- package/src/assets/icons/selection_confirm_pressed.png +0 -0
- package/src/assets/icons/selection_confirm_rest.png +0 -0
- package/src/assets/icons/selection_grouphover.png +0 -0
- package/src/assets/icons/selection_hover.png +0 -0
- package/src/assets/icons/selection_pressed.png +0 -0
- package/src/assets/icons/selection_rest.png +0 -0
- package/src/assets/icons/tool_anno.png +0 -0
- package/src/assets/icons/tool_selection.png +0 -0
- package/src/assets/icons/zoomin_grouphover.png +0 -0
- package/src/assets/icons/zoomin_hover.png +0 -0
- package/src/assets/icons/zoomin_pressed.png +0 -0
- package/src/assets/icons/zoomin_rest.png +0 -0
- package/src/assets/icons/zoomout_grouphover.png +0 -0
- package/src/assets/icons/zoomout_hover.png +0 -0
- package/src/assets/icons/zoomout_pressed.png +0 -0
- package/src/assets/icons/zoomout_rest.png +0 -0
- package/src/core/AnnoAnnotator.ts +102 -0
- package/src/core/BaseAnnotator.ts +43 -0
- package/src/core/ColorAdjustPlugin.ts +256 -0
- package/src/core/Coords.ts +9 -0
- package/src/core/Engine.ts +246 -0
- package/src/core/KonvaAnnotator.ts +185 -0
- package/src/core/Scalebar.ts +87 -0
- package/src/core/SelectionPlugin.ts +252 -0
- package/src/core/Toolbar.ts +370 -0
- package/src/index.ts +21 -0
- package/src/plugins/ShapeLabelsFormatter.js +435 -0
- package/src/plugins/openseadragon-scalebar.js +592 -0
- package/src/plugins/openseadragon-selection.js +657 -0
- package/src/types/type.d.ts +9 -0
package/README.md
ADDED
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# MedViewer SDK
|
|
2
|
+
|
|
3
|
+
MedViewer SDK 是一个强大且灵活的医学图像查看 SDK,它基于 OpenSeadragon 构建,旨在为医学图像分析和注释提供丰富的交互功能。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- **高性能图像查看:** 利用 OpenSeadragon 实现高分辨率医学图像的无缝查看,支持深度缩放和平移功能。
|
|
8
|
+
- **可定制工具栏:**
|
|
9
|
+
- 动态且可配置的工具栏,可集成各种工具和插件。
|
|
10
|
+
- 支持文本和图标按钮。
|
|
11
|
+
- 按钮可以触发设置下拉菜单或直接执行操作。
|
|
12
|
+
- 用户定义的按钮配置可以覆盖默认设置(图标、标签、功能)。
|
|
13
|
+
- 响应式布局,侧边工具栏(MIDDLE_LEFT, MIDDLE_RIGHT)支持垂直方向。
|
|
14
|
+
- **选择插件:**
|
|
15
|
+
- 提供交互式选择功能(例如,绘制矩形)。
|
|
16
|
+
- 可配置的选择外观和行为。
|
|
17
|
+
- 与工具栏集成,方便访问和控制。
|
|
18
|
+
- **比例尺插件:**
|
|
19
|
+
- 在查看器上显示动态比例尺。
|
|
20
|
+
- 支持不同类型的比例尺(例如,显微镜、地图)。
|
|
21
|
+
- 可配置位置、颜色、字体和大小。
|
|
22
|
+
- 自动初始化并与查看器的缩放级别同步。
|
|
23
|
+
- **标注工具:**
|
|
24
|
+
- **Annotorious 集成 (AnnoAnnotator):**
|
|
25
|
+
- 集成 Annotorious 库以提供高级标注功能。
|
|
26
|
+
- 支持各种标注工具(例如,徒手绘制、多边形)。
|
|
27
|
+
- 提供启用/禁用、设置工具、获取/设置标注和清除标注的方法。
|
|
28
|
+
- 动态注入自定义标注样式。
|
|
29
|
+
- **Konva.js 集成 (KonvaAnnotator):**
|
|
30
|
+
- 利用 Konva.js 实现自定义绘图覆盖。
|
|
31
|
+
- 当前支持绘制矩形和可能的箭头(注释掉的同步逻辑表明可能计划了更复杂的交互)。
|
|
32
|
+
- 允许拖动形状。
|
|
33
|
+
- 无论缩放级别如何,都保持恒定的描边宽度 (`strokeScaleEnabled: false`)。
|
|
34
|
+
- 提供启用/禁用、设置工具、获取/设置标注和清除标注的方法。
|
|
35
|
+
- **颜色调整插件:**
|
|
36
|
+
- 启用对图像属性(如亮度、对比度、饱和度、伽马、锐化、边缘增强、伪彩色和反色)的实时调整。
|
|
37
|
+
- **利用 WebGL 着色器:** 直接在 GPU 上实现调整以提高性能。
|
|
38
|
+
- 尝试强制 OpenSeadragon 使用其 WebGL 渲染器以获得最佳功能。
|
|
39
|
+
- 提供自定义 WebGL 着色器用于高级颜色操作。
|
|
40
|
+
- **基于插件的架构:**
|
|
41
|
+
- SDK 采用模块化、基于插件的架构设计,以 `MedViewerEngine` 作为核心协调器。
|
|
42
|
+
- 易于扩展以添加新功能。
|
|
43
|
+
- 管理各种插件的生命周期(初始化、销毁)。
|
|
44
|
+
|
|
45
|
+
## 安装
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# 假设使用 npm 或 yarn 进行包管理
|
|
49
|
+
npm install openseadragon konva # 根据需要添加其他依赖
|
|
50
|
+
# 或
|
|
51
|
+
yarn add openseadragon konva
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
然后,在您的项目中引入 SDK:
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
import { MedViewerEngine } from 'med-viewer-sdk'; // 根据需要调整路径
|
|
58
|
+
// 如果有任何 CSS,请导入
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 用法
|
|
62
|
+
|
|
63
|
+
### 基本初始化
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
import { MedViewerEngine } from './core/Engine'; // 以本地路径为例
|
|
67
|
+
import OpenSeadragon from 'openseadragon';
|
|
68
|
+
|
|
69
|
+
const viewerElement = document.getElementById('med-viewer-container');
|
|
70
|
+
|
|
71
|
+
if (viewerElement) {
|
|
72
|
+
const engine = new MedViewerEngine({
|
|
73
|
+
element: viewerElement,
|
|
74
|
+
viewerOptions: {
|
|
75
|
+
// OpenSeadragon 选项
|
|
76
|
+
id: 'openseadragon-viewer',
|
|
77
|
+
prefixUrl: 'https://openseadragon.github.io/openseadragon/images/',
|
|
78
|
+
tileSources: {
|
|
79
|
+
type: 'image',
|
|
80
|
+
url: 'https://openseadragon.github.io/example-images/duomo/duomo.dzi'
|
|
81
|
+
},
|
|
82
|
+
// ... 其他 OSD 选项
|
|
83
|
+
},
|
|
84
|
+
plugins: {
|
|
85
|
+
toolbar: true, // 启用默认工具栏
|
|
86
|
+
selection: true, // 启用选择插件
|
|
87
|
+
scalebar: { // 启用比例尺插件并带自定义选项
|
|
88
|
+
type: 'MICROSCOPY',
|
|
89
|
+
location: 'BOTTOM_LEFT',
|
|
90
|
+
color: 'rgb(255, 255, 255)',
|
|
91
|
+
fontColor: 'rgb(255, 255, 255)',
|
|
92
|
+
backgroundColor: 'rgba(0, 0, 0, 0.5)',
|
|
93
|
+
},
|
|
94
|
+
anno: true, // 启用 Annotorious
|
|
95
|
+
konva: true, // 启用 Konva.js 绘图
|
|
96
|
+
colorAdjust: { // 启用颜色调整并带初始设置
|
|
97
|
+
initial: {
|
|
98
|
+
brightness: 1.2,
|
|
99
|
+
contrast: 0.8,
|
|
100
|
+
invert: true,
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// 访问插件
|
|
107
|
+
if (engine.toolbar) {
|
|
108
|
+
console.log('工具栏已激活');
|
|
109
|
+
}
|
|
110
|
+
if (engine.selection) {
|
|
111
|
+
engine.selection.enable();
|
|
112
|
+
engine.selection.setSelectionMode('RECTANGLE');
|
|
113
|
+
}
|
|
114
|
+
if (engine.anno) {
|
|
115
|
+
engine.anno.setEnabled(true);
|
|
116
|
+
engine.anno.setTool('rect');
|
|
117
|
+
}
|
|
118
|
+
if (engine.konva) {
|
|
119
|
+
engine.konva.setEnabled(true);
|
|
120
|
+
engine.konva.setTool('rect');
|
|
121
|
+
}
|
|
122
|
+
if (engine.colorAdjust) {
|
|
123
|
+
engine.colorAdjust.setAdjustments({ brightness: 1.5 });
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// 不再需要时进行清理
|
|
127
|
+
// engine.destroy();
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 自定义工具栏
|
|
132
|
+
|
|
133
|
+
您可以通过将 `ToolbarButton` 配置数组传递给 `toolbar` 插件选项来定制工具栏。可以通过匹配其 `id` 来覆盖现有默认按钮。
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import { MedViewerEngine, ToolbarButton } from './core/Engine'; // 以本地路径为例
|
|
137
|
+
import myCustomIcon from './assets/my-icon.png';
|
|
138
|
+
|
|
139
|
+
const customToolbarButtons: ToolbarButton[] = [
|
|
140
|
+
{
|
|
141
|
+
id: 'anno', // 覆盖默认的 'anno' 按钮
|
|
142
|
+
label: '我的标注',
|
|
143
|
+
icon: myCustomIcon, // 使用自定义图标
|
|
144
|
+
// 保留原始的 dropdownContent 或定义新的
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
id: 'customTool', // 添加新的自定义按钮
|
|
148
|
+
label: '新工具',
|
|
149
|
+
onClick: (engine) => {
|
|
150
|
+
alert('自定义工具已点击!');
|
|
151
|
+
// 在此处实现自定义逻辑
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
];
|
|
155
|
+
|
|
156
|
+
const engine = new MedViewerEngine({
|
|
157
|
+
// ...
|
|
158
|
+
plugins: {
|
|
159
|
+
toolbar: {
|
|
160
|
+
buttons: customToolbarButtons,
|
|
161
|
+
// ... 其他工具栏选项
|
|
162
|
+
},
|
|
163
|
+
// ... 其他插件
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
## 引用方式
|
|
170
|
+
|
|
171
|
+
构建完成后,您可以通过以下方式在其他项目中使用 `med-viewer-sdk`:
|
|
172
|
+
|
|
173
|
+
### 1. 本地开发(使用 `npm link`)
|
|
174
|
+
|
|
175
|
+
如果您在本地同时开发 `med-viewer-sdk` 和另一个项目,`npm link` 是一个便捷的选择。
|
|
176
|
+
|
|
177
|
+
- **在 `med-viewer-sdk` 项目目录中执行:**
|
|
178
|
+
```bash
|
|
179
|
+
npm link
|
|
180
|
+
```
|
|
181
|
+
- **在您的其他项目目录中执行:**
|
|
182
|
+
```bash
|
|
183
|
+
npm link med-viewer-sdk
|
|
184
|
+
```
|
|
185
|
+
现在,您就可以像从 npm 安装一样导入 `med-viewer-sdk` 了。
|
|
186
|
+
|
|
187
|
+
### 2. 从本地路径安装
|
|
188
|
+
|
|
189
|
+
您可以直接从文件系统的本地路径安装打包后的 SDK。
|
|
190
|
+
|
|
191
|
+
- **在您的其他项目的 `package.json` 中添加:**
|
|
192
|
+
```json
|
|
193
|
+
"dependencies": {
|
|
194
|
+
"med-viewer-sdk": "file:../path/to/your/med-viewer-sdk", // 根据实际路径调整
|
|
195
|
+
// ... 其他依赖
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
- **然后在您的其他项目目录中运行 `npm install`。**
|
|
199
|
+
|
|
200
|
+
### 3. 发布到包注册表 (例如 npm)
|
|
201
|
+
|
|
202
|
+
如果这是一个可重用的库,您通常会将其发布到包注册表。
|
|
203
|
+
|
|
204
|
+
- **确保您的 `package.json` 已准备好发布:**
|
|
205
|
+
- `name`、`version`、`main`、`module`、`types`、`files` 字段应正确配置。
|
|
206
|
+
- `files` 数组应包含 `dist` 目录和任何其他必要文件。
|
|
207
|
+
- **登录 npm (如果尚未登录):**
|
|
208
|
+
```bash
|
|
209
|
+
npm login
|
|
210
|
+
```
|
|
211
|
+
- **发布:**
|
|
212
|
+
```bash
|
|
213
|
+
npm publish --access public // 如果是私有包,则无需 --access public
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 4. 在您的代码中导入
|
|
217
|
+
|
|
218
|
+
安装/链接后,您可以在应用程序中导入它:
|
|
219
|
+
|
|
220
|
+
- **对于 ES 模块 (推荐用于现代 JS/TS 项目):**
|
|
221
|
+
```typescript
|
|
222
|
+
import { MedViewerEngine } from 'med-viewer-sdk';
|
|
223
|
+
// 或者如果您在脚本标签中需要全局名称:
|
|
224
|
+
// const MedViewerSDK = window.MedViewerSDK;
|
|
225
|
+
```
|
|
226
|
+
- **对于 CommonJS (如果使用 Node.js 或旧版打包工具):**
|
|
227
|
+
```javascript
|
|
228
|
+
const { MedViewerEngine } = require('med-viewer-sdk');
|
|
229
|
+
```
|
|
230
|
+
- **直接在 HTML 中 (UMD 构建):**
|
|
231
|
+
```html
|
|
232
|
+
<script src="path/to/your/node_modules/med-viewer-sdk/dist/med-viewer-sdk.umd.js"></script>
|
|
233
|
+
<script>
|
|
234
|
+
const MedViewerSDK = window.MedViewerSDK;
|
|
235
|
+
// 使用 MedViewerSDK.MedViewerEngine 等
|
|
236
|
+
</script>
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## API 参考
|
|
240
|
+
|
|
241
|
+
(此处将提供 `MedViewerEngine`、`Toolbar`、`SelectionPlugin`、`ScalebarPlugin`、`AnnoAnnotator`、`KonvaAnnotator`、`ColorAdjustPlugin` 及其选项的详细 API 参考。这通常从 JSDoc 或单独的文档生成。)
|
|
242
|
+
|
|
243
|
+
## 开发
|
|
244
|
+
|
|
245
|
+
(有关设置开发环境、运行测试、构建等的说明。)
|
|
246
|
+
|
|
247
|
+
## 贡献
|
|
248
|
+
|
|
249
|
+
(贡献项目的指南。)
|
|
250
|
+
|
|
251
|
+
## 许可证
|
|
252
|
+
|
|
253
|
+
(许可证信息。)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MedEngineOptions } from '../../core/Engine';
|
|
2
|
+
declare const _default: import("vue-demi").DefineComponent<import("vue-demi").ExtractPropTypes<{
|
|
3
|
+
options: {
|
|
4
|
+
type: () => Omit<MedEngineOptions, "element">;
|
|
5
|
+
required: true;
|
|
6
|
+
};
|
|
7
|
+
}>, () => import("vue-demi").VNode<import("vue-demi").RendererNode, import("vue-demi").RendererElement, {
|
|
8
|
+
[key: string]: any;
|
|
9
|
+
}>, {}, {}, {}, import("vue-demi").ComponentOptionsMixin, import("vue-demi").ComponentOptionsMixin, "ready"[], "ready", import("vue-demi").PublicProps, Readonly<import("vue-demi").ExtractPropTypes<{
|
|
10
|
+
options: {
|
|
11
|
+
type: () => Omit<MedEngineOptions, "element">;
|
|
12
|
+
required: true;
|
|
13
|
+
};
|
|
14
|
+
}>> & Readonly<{
|
|
15
|
+
onReady?: ((...args: any[]) => any) | undefined;
|
|
16
|
+
}>, {}, {}, {}, {}, string, import("vue-demi").ComponentProvideOptions, true, {}, any>;
|
|
17
|
+
export default _default;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import "annotorious-openseadragon-ld/dist/annotorious.min.css";
|
|
2
|
+
import { MedViewerEngine } from "./Engine";
|
|
3
|
+
import { BaseAnnotator } from "./BaseAnnotator";
|
|
4
|
+
export declare class AnnoAnnotator extends BaseAnnotator {
|
|
5
|
+
anno: any;
|
|
6
|
+
constructor(engine: MedViewerEngine, config?: any);
|
|
7
|
+
setEnabled(enabled: boolean): void;
|
|
8
|
+
setTool(tool: "rect" | "polygon" | "line" | "point" | "circle" | "ellipse" | "freehand" | null, color?: string): void;
|
|
9
|
+
getAnnotations(): any[];
|
|
10
|
+
setAnnotations(data: any[]): void;
|
|
11
|
+
clear(): void;
|
|
12
|
+
destroy(): void;
|
|
13
|
+
private initEvents;
|
|
14
|
+
private injectStyles;
|
|
15
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { MedViewerEngine } from './Engine';
|
|
2
|
+
/**
|
|
3
|
+
* 标注插件的基类
|
|
4
|
+
*/
|
|
5
|
+
export declare abstract class BaseAnnotator {
|
|
6
|
+
protected engine: MedViewerEngine;
|
|
7
|
+
protected isEnabled: boolean;
|
|
8
|
+
constructor(engine: MedViewerEngine);
|
|
9
|
+
/**
|
|
10
|
+
* 启用/禁用标注功能
|
|
11
|
+
*/
|
|
12
|
+
abstract setEnabled(enabled: boolean): void;
|
|
13
|
+
/**
|
|
14
|
+
* 设置当前的工具模式 (例如:矩形、箭头、多边形)
|
|
15
|
+
*/
|
|
16
|
+
abstract setTool(tool: string | null): void;
|
|
17
|
+
/**
|
|
18
|
+
* 获取所有标注数据 (建议在此处进行格式标准化)
|
|
19
|
+
*/
|
|
20
|
+
abstract getAnnotations(): any[];
|
|
21
|
+
/**
|
|
22
|
+
* 加载标注数据
|
|
23
|
+
*/
|
|
24
|
+
abstract setAnnotations(data: any[]): void;
|
|
25
|
+
/**
|
|
26
|
+
* 清除所有标注
|
|
27
|
+
*/
|
|
28
|
+
abstract clear(): void;
|
|
29
|
+
/**
|
|
30
|
+
* 销毁插件,移除事件监听
|
|
31
|
+
*/
|
|
32
|
+
abstract destroy(): void;
|
|
33
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { MedViewerEngine } from "./Engine";
|
|
2
|
+
export interface ColorAdjustments {
|
|
3
|
+
brightness?: number;
|
|
4
|
+
contrast?: number;
|
|
5
|
+
saturation?: number;
|
|
6
|
+
gamma?: number;
|
|
7
|
+
sharpen?: number;
|
|
8
|
+
edgeEnhance?: number;
|
|
9
|
+
pseudoColor?: boolean;
|
|
10
|
+
invert?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ColorAdjustOptions {
|
|
13
|
+
initial?: ColorAdjustments;
|
|
14
|
+
}
|
|
15
|
+
export declare class ColorAdjustPlugin {
|
|
16
|
+
private engine;
|
|
17
|
+
private adjustments;
|
|
18
|
+
private options;
|
|
19
|
+
constructor(engine: MedViewerEngine, options?: ColorAdjustOptions);
|
|
20
|
+
setAdjustments(adjustments: ColorAdjustments): void;
|
|
21
|
+
getAdjustments(): ColorAdjustments;
|
|
22
|
+
destroy(): void;
|
|
23
|
+
private apply;
|
|
24
|
+
private isWebGLRenderer;
|
|
25
|
+
private forceWebGLRenderer;
|
|
26
|
+
private applyWebGLFilters;
|
|
27
|
+
private setupCustomShader;
|
|
28
|
+
private createShader;
|
|
29
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import OpenSeadragon from "openseadragon";
|
|
2
|
+
import { KonvaAnnotator } from "./KonvaAnnotator";
|
|
3
|
+
import { AnnoAnnotator } from "./AnnoAnnotator";
|
|
4
|
+
import { MedToolbar, type ToolbarOptions } from "./Toolbar";
|
|
5
|
+
import { ColorAdjustPlugin, type ColorAdjustOptions } from "./ColorAdjustPlugin";
|
|
6
|
+
import { SelectionPlugin, type SelectionOptions } from './SelectionPlugin';
|
|
7
|
+
import { ScalebarPlugin, type ScalebarOptions } from './Scalebar';
|
|
8
|
+
/**
|
|
9
|
+
* 引擎配置接口
|
|
10
|
+
*/
|
|
11
|
+
export interface MedEngineOptions {
|
|
12
|
+
element: HTMLElement;
|
|
13
|
+
tileSource: string | any;
|
|
14
|
+
navigatorBorderRadius?: number;
|
|
15
|
+
prefixUrl?: string;
|
|
16
|
+
plugins?: {
|
|
17
|
+
konva?: boolean | any;
|
|
18
|
+
annotorious?: boolean | any;
|
|
19
|
+
toolbar?: boolean | ToolbarOptions;
|
|
20
|
+
colorAdjust?: boolean | ColorAdjustOptions;
|
|
21
|
+
selection?: boolean | SelectionOptions;
|
|
22
|
+
scalebar?: boolean | ScalebarOptions;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 医学影像核心引擎
|
|
27
|
+
* 职责:初始化 OpenSeadragon,管理插件生命周期
|
|
28
|
+
*/
|
|
29
|
+
export declare class MedViewerEngine {
|
|
30
|
+
viewer: OpenSeadragon.Viewer;
|
|
31
|
+
konva: KonvaAnnotator | null;
|
|
32
|
+
anno: AnnoAnnotator | null;
|
|
33
|
+
toolbar: MedToolbar | null;
|
|
34
|
+
colorAdjust: ColorAdjustPlugin | null;
|
|
35
|
+
selection: SelectionPlugin | null;
|
|
36
|
+
scalebar: ScalebarPlugin | null;
|
|
37
|
+
private options;
|
|
38
|
+
constructor(options: MedEngineOptions);
|
|
39
|
+
/**
|
|
40
|
+
* 内部插件初始化逻辑
|
|
41
|
+
* 解决异步 DOM 挂载问题,防止 Annotorious 初始化时找不到 Canvas
|
|
42
|
+
*/
|
|
43
|
+
private initPlugins;
|
|
44
|
+
/**
|
|
45
|
+
* 真正挂载 Annotorious 的私有方法
|
|
46
|
+
*/
|
|
47
|
+
private mountAnnotorious;
|
|
48
|
+
/**
|
|
49
|
+
* 统一切换交互模式
|
|
50
|
+
* @param mode 'browse' | 'konva' | 'anno'
|
|
51
|
+
*/
|
|
52
|
+
setInteractionEffect(mode: "browse" | "konva" | "anno"): void;
|
|
53
|
+
/**
|
|
54
|
+
* 销毁引擎与所有插件
|
|
55
|
+
*/
|
|
56
|
+
destroy(): void;
|
|
57
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import Konva from 'konva';
|
|
2
|
+
import { MedViewerEngine } from './Engine';
|
|
3
|
+
import { BaseAnnotator } from './BaseAnnotator';
|
|
4
|
+
export declare class KonvaAnnotator extends BaseAnnotator {
|
|
5
|
+
stage: Konva.Stage;
|
|
6
|
+
layer: Konva.Layer;
|
|
7
|
+
private overlay;
|
|
8
|
+
private isDrawing;
|
|
9
|
+
private currentShape;
|
|
10
|
+
private currentTool;
|
|
11
|
+
private startPoint;
|
|
12
|
+
constructor(engine: MedViewerEngine);
|
|
13
|
+
/**
|
|
14
|
+
* 实现基类方法:启用/禁用标注层
|
|
15
|
+
*/
|
|
16
|
+
setEnabled(enabled: boolean): void;
|
|
17
|
+
/**
|
|
18
|
+
* 实现基类方法:设置工具
|
|
19
|
+
*/
|
|
20
|
+
setTool(tool: 'rect' | 'arrow' | null): void;
|
|
21
|
+
/**
|
|
22
|
+
* 核心同步逻辑:保持 Canvas 与 OSD 图片位置重合
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* 监听绘图相关的鼠标事件
|
|
26
|
+
*/
|
|
27
|
+
private initDrawingEvents;
|
|
28
|
+
/**
|
|
29
|
+
* 工具方法:获取相对于图像(0~1)空间的鼠标位置
|
|
30
|
+
*/
|
|
31
|
+
private getRelativePointerPosition;
|
|
32
|
+
getAnnotations(): any[];
|
|
33
|
+
setAnnotations(data: any[]): void;
|
|
34
|
+
clear(): void;
|
|
35
|
+
destroy(): void;
|
|
36
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import OpenSeadragon from "openseadragon";
|
|
2
|
+
import "../plugins/openseadragon-scalebar.js";
|
|
3
|
+
export declare enum ScalebarType {
|
|
4
|
+
NONE = 0,
|
|
5
|
+
MICROSCOPY = 1,
|
|
6
|
+
MAP = 2
|
|
7
|
+
}
|
|
8
|
+
export declare enum ScalebarLocation {
|
|
9
|
+
NONE = 0,
|
|
10
|
+
TOP_LEFT = 1,
|
|
11
|
+
TOP_RIGHT = 2,
|
|
12
|
+
BOTTOM_RIGHT = 3,
|
|
13
|
+
BOTTOM_LEFT = 4
|
|
14
|
+
}
|
|
15
|
+
export interface ScalebarOptions {
|
|
16
|
+
type?: ScalebarType;
|
|
17
|
+
pixelsPerMeter?: number;
|
|
18
|
+
xOffset?: number;
|
|
19
|
+
yOffset?: number;
|
|
20
|
+
stayInsideImage?: boolean;
|
|
21
|
+
color?: string;
|
|
22
|
+
fontColor?: string;
|
|
23
|
+
backgroundColor?: string;
|
|
24
|
+
fontSize?: string;
|
|
25
|
+
fontFamily?: string;
|
|
26
|
+
barThickness?: number;
|
|
27
|
+
minWidth?: string;
|
|
28
|
+
location?: ScalebarLocation;
|
|
29
|
+
referenceItemIdx?: number;
|
|
30
|
+
sizeAndTextRenderer?: (ppm: number, minSize: number) => {
|
|
31
|
+
size: number;
|
|
32
|
+
text: string;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export declare class ScalebarPlugin {
|
|
36
|
+
private viewer;
|
|
37
|
+
private options;
|
|
38
|
+
private scalebar;
|
|
39
|
+
constructor(viewer: OpenSeadragon.Viewer, options?: ScalebarOptions);
|
|
40
|
+
private init;
|
|
41
|
+
destroy(): void;
|
|
42
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import OpenSeadragon from "openseadragon";
|
|
2
|
+
import "../plugins/openseadragon-selection.js";
|
|
3
|
+
export interface SelectionOptions {
|
|
4
|
+
element?: HTMLElement | null;
|
|
5
|
+
showSelectionControl?: boolean;
|
|
6
|
+
toggleButton?: HTMLElement | null;
|
|
7
|
+
showConfirmDenyButtons?: boolean;
|
|
8
|
+
styleConfirmDenyButtons?: boolean;
|
|
9
|
+
returnPixelCoordinates?: boolean;
|
|
10
|
+
keyboardShortcut?: string;
|
|
11
|
+
rect?: OpenSeadragon.Rect | null;
|
|
12
|
+
allowRotation?: boolean;
|
|
13
|
+
startRotated?: boolean;
|
|
14
|
+
startRotatedHeight?: number;
|
|
15
|
+
restrictToImage?: boolean;
|
|
16
|
+
onSelection?: (rect: OpenSeadragon.Rect) => void;
|
|
17
|
+
onSelectionCanceled?: () => void;
|
|
18
|
+
onSelectionChange?: (rect: OpenSeadragon.Rect) => void;
|
|
19
|
+
onSelectionToggled?: (state: {
|
|
20
|
+
enabled: boolean;
|
|
21
|
+
}) => void;
|
|
22
|
+
prefixUrl?: string | null;
|
|
23
|
+
navImages?: {
|
|
24
|
+
selection: {
|
|
25
|
+
REST: string;
|
|
26
|
+
GROUP: string;
|
|
27
|
+
HOVER: string;
|
|
28
|
+
DOWN: string;
|
|
29
|
+
};
|
|
30
|
+
selectionConfirm: {
|
|
31
|
+
REST: string;
|
|
32
|
+
GROUP: string;
|
|
33
|
+
HOVER: string;
|
|
34
|
+
DOWN: string;
|
|
35
|
+
};
|
|
36
|
+
selectionCancel: {
|
|
37
|
+
REST: string;
|
|
38
|
+
GROUP: string;
|
|
39
|
+
HOVER: string;
|
|
40
|
+
DOWN: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
borderStyle?: {
|
|
44
|
+
width: string;
|
|
45
|
+
color: string;
|
|
46
|
+
};
|
|
47
|
+
handleStyle?: {
|
|
48
|
+
top: string;
|
|
49
|
+
left: string;
|
|
50
|
+
width: string;
|
|
51
|
+
height: string;
|
|
52
|
+
margin: string;
|
|
53
|
+
background: string;
|
|
54
|
+
border: string;
|
|
55
|
+
};
|
|
56
|
+
cornersStyle?: {
|
|
57
|
+
width: string;
|
|
58
|
+
height: string;
|
|
59
|
+
background: string;
|
|
60
|
+
border: string;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export declare class SelectionPlugin {
|
|
64
|
+
private viewer;
|
|
65
|
+
private selection;
|
|
66
|
+
private options;
|
|
67
|
+
constructor(viewer: OpenSeadragon.Viewer, options?: SelectionOptions);
|
|
68
|
+
private init;
|
|
69
|
+
private setupSelection;
|
|
70
|
+
/**
|
|
71
|
+
* 启用选择模式
|
|
72
|
+
*/
|
|
73
|
+
enable(): void;
|
|
74
|
+
/**
|
|
75
|
+
* 禁用选择模式
|
|
76
|
+
*/
|
|
77
|
+
disable(): void;
|
|
78
|
+
/**
|
|
79
|
+
* 切换选择模式状态
|
|
80
|
+
*/
|
|
81
|
+
toggleState(): void;
|
|
82
|
+
/**
|
|
83
|
+
* 获取当前选择区域
|
|
84
|
+
*/
|
|
85
|
+
getSelection(): OpenSeadragon.Rect | null;
|
|
86
|
+
/**
|
|
87
|
+
* 设置选择区域
|
|
88
|
+
*/
|
|
89
|
+
setSelection(rect: OpenSeadragon.Rect): void;
|
|
90
|
+
/**
|
|
91
|
+
* 清除选择
|
|
92
|
+
*/
|
|
93
|
+
clearSelection(): void;
|
|
94
|
+
/**
|
|
95
|
+
* 检查是否启用选择模式
|
|
96
|
+
*/
|
|
97
|
+
isEnabled(): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* 销毁插件
|
|
100
|
+
*/
|
|
101
|
+
destroy(): void;
|
|
102
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { MedViewerEngine } from "./Engine";
|
|
2
|
+
export type ToolbarPosition = "TOP_LEFT" | "TOP_CENTER" | "TOP_RIGHT" | "BOTTOM_LEFT" | "BOTTOM_CENTER" | "BOTTOM_RIGHT" | "MIDDLE_LEFT" | "MIDDLE_RIGHT";
|
|
3
|
+
export interface ToolbarButton {
|
|
4
|
+
id: string;
|
|
5
|
+
label?: string;
|
|
6
|
+
icon?: string;
|
|
7
|
+
dropdownContent?: (engine: MedViewerEngine, hide: () => void) => HTMLElement;
|
|
8
|
+
onClick?: (engine: MedViewerEngine, hide: () => void) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface ToolbarOptions {
|
|
11
|
+
position?: ToolbarPosition;
|
|
12
|
+
buttons?: ToolbarButton[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* MedToolbar 主类
|
|
16
|
+
*/
|
|
17
|
+
export declare class MedToolbar {
|
|
18
|
+
private engine;
|
|
19
|
+
private options;
|
|
20
|
+
private element;
|
|
21
|
+
private dropdownElement;
|
|
22
|
+
private outsideClickHandler;
|
|
23
|
+
constructor(engine: MedViewerEngine, options?: ToolbarOptions);
|
|
24
|
+
destroy(): void;
|
|
25
|
+
private render;
|
|
26
|
+
private showDropdown;
|
|
27
|
+
private adjustDropdownPosition;
|
|
28
|
+
private closeDropdown;
|
|
29
|
+
private mount;
|
|
30
|
+
private getClassName;
|
|
31
|
+
private injectStyles;
|
|
32
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { MedViewerEngine } from './core/Engine';
|
|
2
|
+
import { KonvaAnnotator } from './core/KonvaAnnotator';
|
|
3
|
+
import { AnnoAnnotator } from './core/AnnoAnnotator';
|
|
4
|
+
import { MedToolbar } from './core/Toolbar';
|
|
5
|
+
import { SelectionPlugin } from './core/SelectionPlugin';
|
|
6
|
+
export { MedViewerEngine, KonvaAnnotator, AnnoAnnotator, MedToolbar, SelectionPlugin };
|