DICOM Viewer 是一套基于 .NET 8 开发的专业级 DICOM 医学影像解决方案,包含桌面影像查看器和 Web API 服务器两大核心组件。支持 CT、MRI、US 等多种模态的 DICOM 图像加载、浏览、测量和导出,并提供完整的 PACS 集成能力和远程影像管理功能。
Sinol.DicomViewer/
├── Sinol.DicomViewer.sln # 主解决方案文件
├── src/
│ ├── Sinol.DicomViewer/ # WPF 桌面应用程序
│ ├── Sinol.DicomViewer.Core/ # 共享核心库
│ └── Sinol.PACS.Server/ # Web API 服务器
├── UI/
│ ├── Wpf.Ui/ # WPF UI 控件库
│ ├── Wpf.Ui.Abstractions/ # UI 抽象层
│ └── Wpf.Ui.DependencyInjection/ # 依赖注入扩展
└── Directory.Packages.props # 中央包管理
技术栈: .NET 8 | WPF | MVVM | Wpf.Ui | fo-dicom
| 功能 | 说明 |
|---|---|
| 多模态支持 | CT、MRI、US、CR、DX 等多种 DICOM 模态 |
| 平滑滚动 | 鼠标滚轮快速浏览图像堆栈 |
| 窗宽窗位 | 左键拖拽交互式调节 |
| 缩放平移 | Ctrl+滚轮缩放,右键拖拽平移 |
| Cine 播放 | 基于 DICOM 元数据的动态电影播放 |
| 多帧支持 | 支持多帧 DICOM 文件播放 |
| 工具 | 说明 |
|---|---|
| 距离测量 | 支持像素间距自动计算实际距离 (mm) |
| 角度测量 | 三点定义精确角度测量 |
| ROI 统计 | 感兴趣区域的 HU 值统计分析 |
| 功能 | 说明 |
|---|---|
| C-ECHO | DICOM 服务器连接测试 |
| C-FIND | 远程检查查询 |
| C-MOVE | 检查检索下载 |
| C-STORE | 影像上传发送 |
| Web API | RESTful API 影像访问 |
- PNG 图像导出
- PDF 报告生成 (QuestPDF)
- CSV 数据导出
Sinol.DicomViewer/
├── Views/ # 视图层
│ ├── MainWindow.xaml # 主窗口
│ ├── PacsQueryWindow.xaml # PACS 查询窗口
│ ├── MprWindow.xaml # MPR 多平面重建窗口
│ ├── DicomTagsWindow.xaml # DICOM 标签查看器
│ └── Pages/ # 导航页面
│ ├── MainPage.xaml # 影像查看主页
│ ├── PatientPage.xaml # 患者管理
│ ├── ReportPage.xaml # 报告管理
│ └── SettingsPage.xaml # 系统设置
├── ViewModels/ # 视图模型 (MVVM)
├── Services/ # 应用服务
│ ├── DicomRenderingService # DICOM 渲染服务
│ ├── MprService # MPR 重建服务
│ ├── PacsApiService # Web API 客户端
│ └── ConfigService # 配置管理
├── Converters/ # 值转换器
├── Helpers/ # 工具类
└── Models/ # 应用模型
技术栈: .NET 8 | ASP.NET Core | fo-dicom | SixLabors.ImageSharp
- 自动扫描指定目录的 DICOM 文件
- 内存索引快速检索
- 支持实时索引重建
| 模块 | 端点 | 说明 |
|---|---|---|
| 患者 | GET /api/patients |
分页查询患者列表 |
GET /api/patients/{id}/studies |
获取患者检查 | |
| 检查 | GET /api/studies |
分页查询检查列表 |
GET /api/studies/{uid} |
获取检查详情 | |
GET /api/studies/{uid}/series |
获取检查系列 | |
| 系列 | GET /api/series/{uid} |
获取系列详情 |
GET /api/series/{uid}/instances |
获取系列实例 | |
| WADO | GET /api/wado/image/{uid} |
获取渲染图像 (JPEG) |
GET /api/wado/image/{uid}/png |
获取渲染图像 (PNG) | |
GET /api/wado/thumbnail/{uid} |
获取缩略图 | |
GET /api/wado/dicom/{uid} |
下载原始 DICOM | |
GET /api/wado/metadata/{uid} |
获取 DICOM 标签 | |
| 索引 | GET /api/index/statistics |
索引统计信息 |
POST /api/index/rebuild |
重建索引 |
- 窗宽窗位参数支持
- 多帧图像访问
- 自动缩略图生成与缓存
- JPEG/PNG 格式转换
Sinol.PACS.Server/
├── Controllers/ # API 控制器
│ ├── PatientsController.cs # 患者 API
│ ├── StudiesController.cs # 检查 API
│ ├── SeriesInstancesController.cs # 系列/实例 API
│ └── WadoController.cs # WADO 图像访问 API
├── Services/ # 业务服务
│ ├── DicomIndexService.cs # DICOM 文件索引服务
│ └── DicomImageService.cs # 图像渲染服务
├── Models/ # 数据模型
├── Program.cs # 应用程序入口
└── appsettings.json # 配置文件
{
"DicomStorage": {
"RootPath": "E:\\Sinol\\3D.Scan\\CBCT\\DataSetes",
"ThumbnailCachePath": "thumbnails",
"ThumbnailSize": 128
}
}技术栈: .NET 8 | fo-dicom | Dapper | 多数据库支持
| 模型 | 说明 |
|---|---|
Patient |
患者信息 |
Examination |
检查记录 |
Report |
诊断报告 |
DicomSeries |
DICOM 系列 |
DicomFrame |
DICOM 帧数据 |
PacsNode |
PACS 节点配置 |
QueryResult |
查询结果 |
| 服务 | 说明 |
|---|---|
DicomLoader |
DICOM 文件加载与解析 |
PacsService |
PACS 协议实现 (C-ECHO/FIND/MOVE/STORE) |
PatientDbService |
患者数据管理 |
ReportService |
报告生成与管理 |
| 仓储 | 说明 |
|---|---|
PatientRepository |
患者数据 CRUD |
ExaminationRepository |
检查数据 CRUD |
ReportRepository |
报告数据 CRUD |
- SQLite - 默认本地存储
- MySQL - 生产环境
- SQL Server - 企业级部署
- .NET 8 SDK
- Windows 10/11 (WPF 应用)
- Visual Studio 2022 或 Rider (推荐)
# 1. 克隆仓库
git clone <repository-url>
cd Sinol.DicomViewer
# 2. 恢复依赖
dotnet restore
# 3. 启动 PACS Web API 服务器
cd src/Sinol.PACS.Server
dotnet run
# 服务器将在 http://localhost:5180 启动
# Swagger 文档: http://localhost:5180/swagger
# 4. 启动桌面应用 (新终端)
cd src/Sinol.DicomViewer
dotnet run-
本地文件查看
- 点击 "打开文件夹" 选择包含 DICOM 文件的目录
-
PACS 远程查询
- 菜单 → PACS 查询
- 选择服务器类型:
- Sinol PACS Web API - 本地 Web API 服务器
- DICOM 服务器 - 标准 PACS (C-FIND/C-MOVE)
- 点击"测试连接"验证服务器状态
- 输入查询条件并点击"查询"
- 选择检查后点击"下载"
| 操作 | 功能 |
|---|---|
| 左键拖拽 | 调节窗宽窗位 |
| 右键拖拽 | 平移图像 |
| 滚轮 | 切换切片 |
| Ctrl + 滚轮 | 缩放图像 |
| 双击 | 重置视图 |
| 按键 | 功能 |
|---|---|
Ctrl+O |
打开文件夹 |
Space |
播放/暂停 Cine |
R |
重置窗宽窗位 |
M |
测量工具 |
Esc |
取消当前操作 |
curl "http://localhost:5180/api/studies?pageIndex=0&pageSize=10"# 获取 JPEG 图像
curl "http://localhost:5180/api/wado/image/{sopInstanceUid}" -o image.jpg
# 指定窗宽窗位
curl "http://localhost:5180/api/wado/image/{sopInstanceUid}?windowCenter=40&windowWidth=400"
# 获取缩略图
curl "http://localhost:5180/api/wado/thumbnail/{seriesInstanceUid}?size=256"| 组件 | 技术 |
|---|---|
| 运行时 | .NET 8 |
| 桌面 UI | WPF + Wpf.Ui (Fluent Design) |
| DICOM 库 | fo-dicom 5.x |
| Web 框架 | ASP.NET Core |
| 图像处理 | SixLabors.ImageSharp |
| ORM | Dapper |
| PDF 生成 | QuestPDF |
| 依赖注入 | Microsoft.Extensions.DependencyInjection |
本项目为专有软件,未经授权禁止使用、复制或分发。