简介:Weasis 是一款免费开源的医疗 DICOM 查看器,既可作为桌面应用运行于 Windows、Mac OS X 与 Linux,也能通过 weasis 协议在 Web 端访问,面向医院、健康网络、多中心研究试验及患者个人健康档案等场景。它支持灵活集成到 HIS 或 PHR 系统,具备多国语言界面、服务端与客户端偏好配置、自定义插件 API,以及 DICOM 发送(storeSCU、STOW-RS)、查询检索(C-GET、C-MOVE、WADO-URI)与 DICOMWeb 等能力,还可嵌入 CD/DVD 等便携介质作为离线查看器。资源以 zip 压缩包形式提供,整体约 2.54MB,涉及 Java 相关源码与配置内容,master 分支对应 Weasis 3.xx(需 Java 8+),旧分支则覆盖 2.5.x、2.0.x 与 1.2.x。目前已有 1089 人学习下载,适合医学影像开发人员、PACS 集成工程师及需要二次开发 DICOM 查看器的技术读者参考,可据此了解其构建方式、功能模块与插件扩展思路。
1. 医学影像浏览的第三条路:为什么我最终选了 Weasis
影像科日常最头疼的事,不是扫描序列有多复杂,而是临床科室一个电话打过来:“这个病人的 CT 能不能发我电脑上看看?”过去几年我试过不少方案,要么装一个几百兆的本地客户端,要么让工程师临时搭一套在线阅片服务,前者部署麻烦,后者维护成本高。直到某次在一个跨平台影像处理 Demo 里接触到 Weasis,才发现 DICOM 查看器其实有第三条路——同一套核心,既能当桌面应用跑,也能以 Web 应用形态嵌进浏览器。Weasis 本身是一个开源 DICOM 查看器,支持 Windows、Linux、macOS 桌面端,也能通过 Web 启动器在浏览器里调用本地能力。它解决的核心问题很具体:让影像数据在不依赖某一家厂商 PACS 客户端的前提下,被稳定地打开、测量、调窗和导出。适合谁?适合需要快速搭建阅片能力的中小机构、做医学影像相关开发的工程师,以及想在自己机器上离线看片的从业者。
2. Weasis 的两种形态:桌面端和 Web 端到底怎么选
2.1 桌面应用形态的适用边界
桌面形态是 Weasis 最成熟的用法。它本质上是一个基于 Java 的富客户端,启动后直接读取本地文件系统或通过 DICOM 网络协议(C-STORE、C-FIND、C-MOVE)连接 PACS。我一般会在两种场景下优先选桌面端:一是需要批量处理大量序列,比如一次拉几百张薄层 CT,桌面端的本地缓存和内存管理更可控;二是网络环境不稳定,Web 端每次启动都要重新拉取资源,桌面端装一次就能离线用。
桌面端的安装方式常见有两种:一种是直接下载对应平台的安装包,另一种是用 Java Web Start 或命令行启动。以命令行启动为例,核心是给 JVM 分配足够堆内存,否则打开多序列时会直接卡死:
# 启动 Weasis 桌面端,分配 2GB 堆内存,指定临时缓存目录 java -Xmx2048m \ -Dweasis.cache.dir=/data/weasis-cache \ -jar weasis-launcher.jar这段命令里-Xmx2048m是关键参数。Weasis 默认堆内存往往偏小,打开一个包含 500 张以上切片的增强 CT 时,如果堆内存不足,表现是界面能出来但滚动到一半就白屏。-Dweasis.cache.dir指定缓存目录,建议放在 SSD 上,因为 Weasis 会把从 PACS 拉取的影像先落盘再渲染,机械硬盘上翻页会有明显顿挫。参数怎么改?如果机器内存 16GB 以上,可以给到 4096m;如果只是看 DR 平片,1024m 也够用。
2.2 Web 应用形态的启动链路
Web 形态是 Weasis 比较有特色的地方。它不是把影像渲染完全放在服务器端,而是通过浏览器启动一个本地代理,再由代理调用本地 Weasis 核心。这样做的原因是浏览器本身无法直接访问本地文件系统和 DICOM 网络端口,必须有一个中间层做桥接。常见做法是部署一个 Web 启动器服务,浏览器访问页面后下载一个轻量启动器,启动器再拉起本地 Weasis。
部署 Web 端时,我一般会先确认三件事:Java 运行环境是否就绪、启动器服务是否允许跨域、DICOM 数据源是否可达。下面是一个最小化的启动器配置片段,用于告诉 Weasis 从哪里拉取影像:
# weasis-web-config.properties # DICOM 数据源地址,指向你的 PACS 或影像归档服务 dicom.source.url=http://your-imaging-service/dicomweb # 启动器监听端口,避免与现有服务冲突 launcher.port=8080 # 允许的跨域来源,生产环境不要用通配符 cors.allowed.origins=https://your-viewer-hostdicom.source.url指向的是 DICOMweb 接口,Weasis 支持通过 QIDO-RS 查询、WADO-RS 拉取影像。如果你的后端只支持传统 DICOM 协议,那就需要额外部署一个 DICOMweb 代理,这一步是 Web 形态落地时最容易卡住的地方。launcher.port建议避开 8080 这类常用端口,我遇到过多次因为端口被占导致启动器静默失败的情况。cors.allowed.origins在生产环境必须收紧,否则任何页面都能调用本地启动器,存在安全风险。
2.3 两种形态的选型对照
| 维度 | 桌面应用 | Web 应用 |
|---|---|---|
| 部署方式 | 逐台安装或脚本分发 | 服务端部署一次,浏览器访问 |
| 离线能力 | 完全离线可用 | 依赖启动器服务可达 |
| 升级维护 | 需要逐台更新 | 服务端更新即可 |
| 适用场景 | 固定工作站、批量阅片 | 临床科室临时查看、多终端接入 |
| 网络要求 | 仅需 PACS 可达 | 需启动器服务与数据源均可达 |
选型建议很直接:如果用户群体固定、机器可控,桌面端省事;如果用户分散、不想逐台装软件,Web 端更合适,但要接受启动器服务带来的额外运维成本。
3. 用 Weasis 打开第一组影像:从本地文件到 DICOM 网络
3.1 本地文件导入的最小操作路径
Weasis 支持直接打开本地 DICOM 文件或文件夹。操作路径是:启动后选择“导入”或直接把文件夹拖进窗口。但这里有个细节,如果文件夹里混有非 DICOM 文件,Weasis 会跳过它们而不是报错,所以导入后如果发现序列不全,先检查文件扩展名和实际编码是否一致。
对于开发者来说,更常见的是通过命令行参数直接指定导入路径,方便集成到自动化流程里:
# 启动 Weasis 并自动导入指定目录下的 DICOM 文件 java -Xmx2048m \ -Dweasis.cache.dir=/data/weasis-cache \ -jar weasis-launcher.jar \ --import=/data/dicom-study/patient-001--import参数后面跟目录路径,Weasis 会递归扫描并构建序列。注意路径不要有中文和空格,虽然新版本对中文路径支持有改善,但在某些 Linux 发行版上仍然会出现编码问题,表现是导入后序列名显示为乱码。如果必须用中文路径,建议先做一次软链接。
3.2 连接 PACS 的 DICOM 网络配置
Weasis 内置了 DICOM 网络节点配置界面,可以添加 C-FIND、C-MOVE、C-GET 等节点。配置项包括 AE Title、主机地址、端口、以及查询级别。我一般会先确认 PACS 端是否允许当前 IP 发起查询,很多机构的 PACS 有白名单限制,没加白名单时表现是连接超时而不是明确报错。
配置完成后,在 Weasis 里输入患者 ID 或检查号就能拉取影像。这里有个参数容易忽略:查询超时时间。默认值在某些网络环境下偏短,导致大检查拉取到一半断开。可以在配置里把超时调到 60 秒以上:
# DICOM 网络节点配置片段 dicom.node.name=MainPACS dicom.node.aeTitle=WEASIS dicom.node.host=10.0.0.100 dicom.node.port=104 # 查询超时,单位毫秒 dicom.node.queryTimeout=60000 # 检索级别:STUDY / SERIES / IMAGE dicom.node.queryLevel=STUDYdicom.node.aeTitle是本机在 PACS 侧注册的 AE Title,必须和 PACS 白名单里登记的一致,否则会被拒绝。dicom.node.queryLevel设为 STUDY 时按检查级别检索,适合先看列表再拉影像;设为 IMAGE 时直接拉具体影像,适合已知序列号的情况。超时参数我一般设 60000 到 120000 之间,视网络质量而定。
3.3 影像加载后的基础操作
影像加载完成后,Weasis 的默认布局是缩略图加主视图。常用操作包括调窗、缩放、平移、测量。调窗快捷键是鼠标右键拖动,水平方向调窗宽,垂直方向调窗位。测量工具在工具栏里,支持长度、角度、面积、CT 值。这里有个血泪经验:测量前先确认图像是否已经做过重采样,如果序列本身是各向异性的,直接测长度会有偏差,需要先在设置里启用各向异性校正。
导出方面,Weasis 支持导出为 JPEG、PNG、DICOM 以及视频。导出视频时注意帧率设置,默认 10 帧每秒对于心脏电影序列偏慢,可以调到 25 或 30。导出路径不要选网络驱动器,我遇到过多次因为网络抖动导致导出中断且临时文件残留的情况。
4. 避坑与排查:Weasis 落地时最容易翻车的五个点
4.1 启动后白屏或闪退
现象:双击启动器后窗口一闪而过,或者界面出来但一片空白。原因通常是 Java 版本不匹配或堆内存不足。Weasis 对 Java 版本有要求,过高或过低的版本都可能导致启动失败。解决方法是先确认本机 Java 版本,然后显式指定堆内存启动。如果仍然白屏,查看日志目录下的启动日志,通常能看到具体的异常堆栈。
4.2 导入后序列显示不全
现象:明明文件夹里有几百张 DICOM,导入后只显示几十张。原因可能是文件扩展名不统一,或者部分文件缺少必要的 DICOM 标签。Weasis 依赖 Series Instance UID 来分组序列,如果这个标签缺失或重复,分组就会出错。解决方法是先用 DICOM 校验工具扫描一遍,补全缺失标签后再导入。
4.3 PACS 连接超时或拒绝
现象:配置好节点后查询一直转圈,最后提示超时。原因通常是 AE Title 不匹配、IP 未加白名单、或者端口被防火墙拦截。解决步骤是先在命令行用 telnet 测试端口连通性,再确认 AE Title 是否在 PACS 侧注册。如果 PACS 要求 TLS,还需要配置证书,这一步在 Weasis 里是通过 Java 密钥库完成的,容易漏配。
4.4 Web 端启动器被浏览器拦截
现象:浏览器提示启动器不安全或直接阻止下载。原因是启动器没有签名,或者浏览器安全策略收紧。解决方法是给启动器做代码签名,或者在浏览器策略里把查看器域名加入信任列表。生产环境建议做签名,否则每次浏览器升级都可能重新触发拦截。
4.5 大序列翻页卡顿
现象:打开薄层 CT 后翻页明显卡顿,内存占用持续升高。原因是堆内存不足或缓存目录在机械硬盘上。解决方法是增大堆内存,把缓存目录移到 SSD,并在设置里限制预加载帧数。预加载帧数默认值偏高,对于内存紧张的机器可以调低到 50 左右。
5. 进阶技巧:把 Weasis 嵌进自己的影像处理流程
5.1 用命令行参数做自动化集成
Weasis 支持通过命令行参数控制导入、导出、布局等行为,这意味着可以把它嵌进自动化脚本里。比如批量把 DICOM 转成 PNG,可以先启动 Weasis 并指定导出参数:
# 批量导出为 PNG,指定输出目录和图像质量 java -Xmx4096m \ -jar weasis-launcher.jar \ --import=/data/dicom-input \ --export=/data/png-output \ --export-format=png \ --export-quality=0.9--export-format支持 png、jpg、dicom 等,--export-quality对 JPEG 有效,范围 0 到 1。这个用法适合做影像预处理,比如把 DICOM 转成 PNG 后喂给下游的图像处理模型。注意导出时如果序列包含多帧,Weasis 会按帧拆分成多个文件,命名规则可以在配置里调整。
5.2 自定义布局与快捷键
Weasis 的布局可以通过配置文件预定义,比如设置默认显示 2x2 网格、指定每个视图的默认窗宽窗位。配置文件通常是一个 XML,放在用户目录下的隐藏文件夹里。我一般会为不同检查类型准备不同的布局配置:CT 用 2x2,MR 用 1x2,DR 用单视图。快捷键也可以重映射,比如把调窗改成更顺手的组合键。
5.3 验证方法:怎么确认配置真的生效
配置改完后,不要只看界面,要用具体操作验证。比如改了堆内存,就打开一个已知的大序列,滚动到底部看是否卡顿;改了 DICOM 超时,就拉一个跨网段的检查,看是否还会中途断开。我习惯在改动后记录三个指标:启动时间、大序列加载时间、导出耗时。这三个指标稳定,才说明配置真正落地了。
5.4 一个具体技巧:用脚本批量预取影像
如果每天需要固定查看某些检查,可以写一个脚本在空闲时段预取影像到本地缓存。Weasis 的缓存目录结构是按 Series UID 组织的,预取后第二天打开就是秒开。脚本核心是调用 Weasis 的命令行导入功能,配合定时任务:
#!/bin/bash # 预取指定检查号的影像到本地缓存 STUDY_UID="1.2.840.xxxxx.xxxxx" java -Xmx2048m \ -Dweasis.cache.dir=/data/weasis-cache \ -jar weasis-launcher.jar \ --import=dicom://MainPACS?studyUID=${STUDY_UID}这个脚本可以放在夜间定时执行,第二天阅片时直接读缓存。注意dicom://后面的节点名要和配置里的dicom.node.name一致,否则会找不到数据源。
我自己的习惯是每次调整 Weasis 配置后,先在一台非生产机器上跑一遍完整流程,确认没有白屏、没有序列缺失、没有导出中断,再推到工作站上。这个习惯帮我省掉了不少后悔药。希望帮到你。
本文还有配套的精品资源,点击获取