OHIF Viewer 工具栏完整指南:测量、窗宽窗位与截图导出一次讲透
【免费下载链接】ViewersOHIF zero-footprint DICOM viewer and oncology specific Lesion Tracker, plus shared extension packages项目地址: https://gitcode.com/GitHub_Trending/vi/Viewers
OHIF Viewer 是一款零部署的开源 DICOM 查看器,它的工具栏(Toolbar)是阅片时最高频的操作入口:测量病灶、调窗宽窗位、平移缩放、导出截图、切换布局,全部收拢在屏幕顶端这一条图标栏里。本文以 Basic 模式为主线,按一次真实阅片的顺序把工具栏走一遍——先调窗、再测量、最后导出——再拆解每个按钮背后的命令与求值机制。
打开检查后:工具栏从左到右怎么排
在 Studies 列表点开一个检查后,你会进入查看器主界面。视线从左到右扫一遍顶部这一条:最左侧是返回箭头,点一下就回到检查列表;旁边是品牌区,机构可以把 Logo 换成自己的标识(white labelling);中间占据主体的是工具区;最右侧是应用偏好设置入口。
工具区里按钮的排布顺序是固定的primary分区:测量工具(MeasurementTools)、Zoom、Pan、3D Rotate、Window/Level、Capture(截图)、Layout、Crosshairs,最后是 More Tools 菜单。除了顶部工具栏,视口自身还带几组"角落菜单":左下角是 W/L 预设入口,底部中间是 AdvancedRenderingControls 高级渲染控制区,左上角有方位切换与数据叠加菜单。这些属于viewportActionMenu分区(topLeft、bottomLeft、bottomMiddle 等),不在顶部工具栏里,别找错地方。
窗宽窗位预设怎么选:Window/Level 两步走
刚打开一个 CT,默认窗位往往不适合你要看的结构。调窗有两条路:
自由调整:点击 Window/Level 图标激活工具,然后在视口上按住鼠标拖拽,窗宽窗位实时变化,直到对比度合适。
一键预设:点击工具旁的下拉箭头(caret),会展开常见成像场景的预定义 W/L 设置:
| 预设 | 窗宽/窗位 | 快捷键 |
|---|---|---|
| Soft tissue(软组织) | 400/40 | 1 |
| Lung(肺窗) | 1500/-600 | 2 |
| Liver(肝窗) | 150/90 | 3 |
| Bone(骨窗) | 80/40 | 4 |
| Brain(脑窗) | 2500/480 | 5 |
看肺实质直接按 2 套肺窗,看心脏按 1 套软组织窗,比手动拖快得多。
源码里 W/L 相关按钮不止一个:顶部工具栏的WindowLevel按钮在 primary 分区;视口左下角的专用菜单是windowLevelMenu;底部中间的 AdvancedRenderingControls 区还挂了windowLevelMenuEmbedded和手动 VOI 控制菜单voiManualControlMenu。定义都集中在 toolbarButtonsCustomization.ts。
完成一次病灶测量:Length、Bidirectional 与椭圆
窗调好之后开始测量。流程是固定的三步:选中测量工具 → 它成为 active 激活工具(按钮高亮)→ 在视口上绘制,结果实时显示,右侧测量面板(Measurements)同步记录。想换工具,点测量按钮旁的下拉箭头展开列表即可。
MeasurementTools 分区默认包含这些工具:
| 工具 | 用途 | 显示结果 |
|---|---|---|
| Length | 两点之间的线性距离 | mm |
| Bidirectional | 最长径(LD)与最长垂直径(LPD) | mm |
| Annotation | 带自由文本标签的定性标记 | 文本 |
| EllipticalROI | 椭圆区域面积与平均 CT 值 | mm² / HU |
| RectangleROI | 矩形区域面积与平均 CT 值 | mm² / HU |
| CircleROI | 圆形区域 | mm |
| PlanarFreehandROI / SplineROI / LivewireContour | 平面自由手 / 样条 / 活线轮廓 | 面积与长度 |
每个测量按钮都通过setToolActiveToolbar命令激活工具,这个命令会同时向default、mpr、SRToolGroup、volume3d四个工具组广播——同一个 Length 工具因此在 2D 堆栈、MPR 和 SR 视口上都能直接用,不需要切换工具组。
如何校准像素间距:Pixel Spacing 不对时怎么办
Length、Bidirectional 这类长度测量的物理单位,来自图像的 Pixel Spacing 属性——患者体内相邻像素中心之间的物理距离,由一对数值指定(相邻行间距 / 相邻列间距,单位 mm)。元数据缺失或出错时,测量值就会失真。这时用 More Tools 菜单里的 Calibration(校准)工具,在一段已知真实长度的结构(如标尺、已知尺寸的解剖标志)上画校准线,即可覆盖(override)原始 Pixel Spacing。
平移、缩放与布局:Pan、Zoom 和 Layout Selector 怎么用
图像看不顺眼时,三个工具分工明确:
- Zoom(缩放):激活后在图像上点击并拖拽调整缩放级别,放大倍数实时显示在视口角落。
- Pan(平移):激活后点击并拖拽,移动图像位置。
- 3D Rotate:面向 3D 容积视口的轨道旋转;当前没有 3D 视口时按钮会置灰,并提示 "Select a 3D viewport to enable this tool"。
Layout Selector负责视口网格布局。它使用ohif.layoutSelector类型,默认提供rows: 3, columns: 4的可选范围——从 1x1 到 3x4,点格子就能切换分割方式。多平面对照阅片(比如矢状面 + 冠状面 + 轴状面 + 斜位)时,这是最常用的按钮之一。
视口截图导出:文件名、尺寸、格式怎么配
📷 需要把当前视图放进报告或邮件时,点工具栏的相机图标(Capture)。弹出"Download High Quality Image"模态框,可以配置四项:
- File Name:文件名
- Image width / height (px):输出图像的宽高
- File Type:文件格式(png、jpg 等)
- Show Annotations:是否把视口上的测量标注一起渲染进截图
下方有实时图像预览,确认无误后点 Download 落到本地。注意video(视频)与wholeSlide(全切片 WSI)两种视口不支持该功能,按钮在对应视口上会自动禁用——这由按钮定义里的evaluate.viewport.supported排除逻辑控制。
More Tools 菜单:一键重置视图、旋转、反色与序列联动
More Tools 菜单聚合了视图操作类工具,常用项如下:
| 按钮 | 绑定命令 | 作用 |
|---|---|---|
| Reset View | resetViewport | 重置位置、缩放、窗宽窗位等全部图像操作 |
| Rotate Right | rotateViewportCW | 顺时针旋转 90 度 |
| Flip Horizontal | flipViewportHorizontal | 水平镜像翻转 |
| Image Slice Sync | toggleSynchronizer(type:imageSlice) | 联动各堆叠视口的位置同步 |
| Stack Scroll | setToolActiveToolbar | 所有含图视口同步滚动 |
| Magnify | setToolActiveToolbar | 点击图像放大查看局部细节 |
| Invert | invertViewport | 反转灰度色阶 |
| Cine | toggleCine | 在当前视口开启电影播放,点播放器上的x或再次点击按钮关闭 |
| Angle / Probe / Rectangle | setToolActiveToolbar等 | 可调角度测量 / 拖拽查看像素值 / 矩形面积与 CT 值(mm²、HU) |
从 More Tools 里选中的工具会成为激活工具,直到你点击其他工具把它替换掉。
为什么不同视口上有些按钮灰着?每个按钮都带evaluate求值逻辑,由 ToolbarService 在状态变化时重新计算。例如flipHorizontal同时检查evaluate.viewportProperties.toggle且排除video、volume3d视口;Cine用evaluate.cine并排除volume3d;rotate-right排除video。这套"命令 + 求值"的双层设计,让同一份按钮定义可以安全复用在 2D 堆栈、MPR、3D 容积、视频和 WSI 各种视口上,无需为每种视口单独写分支。
工具栏源码拆解:按钮即数据,命令与求值双层机制
想改工具栏或理解它为什么这么灵活,看三层就够:
数据层:cornerstone 扩展以"能力包"形式注册两组自定义项——cornerstone.toolbarButtons(全部按钮定义,每个按钮就是id、uiType、commands、evaluate的数据对象)与cornerstone.toolbarSections(分区到按钮 ID 列表的映射),见 toolbarButtonsCustomization.ts。
装配层:Basic 模式在 index.tsx 中通过{ $reference: 'cornerstone.toolbarButtons' }、{ $reference: 'cornerstone.toolbarSections' }引用这两个能力包;模式进入时 modeCustomization.ts 的registerModeToolbar调用toolbarService.register()注册按钮、按分区updateSection()装配布局。第三方扩展或?customization=模块可以在不重建模式的前提下追加按钮。
渲染层:core 平台的 ToolbarService.ts 预定义了TOOLBAR_SECTIONS(primary、secondary与viewportActionMenu的八个方位分区);Toolbar.tsx 用useToolbarhook 取当前分区的按钮列表(默认primary),为每个按钮注入isOpen、isLocked、onToggleLock等交互状态后渲染成 UI。
打开一个 Basic 模式检查,按 2 套用肺窗、画一条 Bidirectional、再导出带标注的 PNG——整套流程走完,工具栏就熟了。想继续深入按钮的注册与装配细节,从toolbarSections映射和 ToolbarService 的求值流程开始读起即可。
【免费下载链接】ViewersOHIF zero-footprint DICOM viewer and oncology specific Lesion Tracker, plus shared extension packages项目地址: https://gitcode.com/GitHub_Trending/vi/Viewers
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考