Skip to content

打造中文开源社区最完善轻量PACS系统,医学影像必备DICOM工具箱!

License

Notifications You must be signed in to change notification settings

fightroad/DicomSCP

Repository files navigation

DICOM 管理系统

携手Cursor重磅发布,打造中文开源社区最完善轻量PACS系统,医学影像必备DICOM工具箱!

  • 基于 .NET Core 的 DICOM SCP(Service Class Provider)服务器,提供 DICOM 存储、工作列表、查询检索服务,打印服务,WADO/DicomWeb服务,集成了功能强大的DICOM 桌面和Web查看器。

  • 项目支持跨平台,windows直接下载发布版本运行,linux直接使用Docker部署 。 weasis查看影像需要客户端电脑安装了才能调用。

  • 推荐使用 Docker部署 推送会自动更新镜像。其他版本可以自行拉取dev分支构建,发行版不定期发布。

  • 项目用爱发电,作者多年医学影像从业者,旨在为中文医学影像提供一个轻量级的DICOM解决方案。不限制使用,但请遵守MIT许可证

  • 个人项目,仅供大家参考学习,没有详细测试过,有问题可以提issue,能修复的bug有时间会修复。

  • 项目定位是轻量的PACS,专注对DICOM的处理,不会增加RIS相关的内容。

  • 项目Gitee仓库

  • 项目GitHub仓库

支持项目

如果这个项目对您有帮助,欢迎赞助支持我们继续改进!

微信赞助
微信赞助
支付宝赞助
支付宝赞助

您的每一份支持都将帮助我们:

  • 🚀 开发新功能
  • 🐛 修复已知问题
  • 📚 完善项目文档
  • 🎨 优化用户体验

赞助时请备注您的 Gitee/GitHub ID,我们会将您添加到赞助者名单中。

功能预览

登录 影像管理 weasis预览 3d预览 OHIF预览 序列预览 工作列表
查询检索 发送图像
打印
胶片
配置 日志 监控 swagger

功能特性

  • 存储服务 (C-STORE SCP)

    • 按照4个级别的标签入库和归档
    • 按照级别标签自动组织存储目录结构
    • 支持 JPEG、JPEG2000、JPEG-LS、RLE 等压缩
    • 对不标准的字符集中文字符进行乱码处理
  • 工作列表服务 (Worklist SCP)

    • 提供标准 DICOM Modality Worklist 服务
    • 支持多种查询条件(患者ID、检查号、日期等)
    • 支持请求字符集协商自动中英文转换
  • 查询检索服务 (QR SCP)

    • 提供 C-FIND、C-MOVE、C-GET 服务
    • 可配置多个目标节点
    • 支持多种查询级别(Study/Series/Image)
    • 支持JPEG、JPEG2000、JPEG-LS、RLE 传输语法实时转码
  • 打印服务 (Print SCP)

    • 打印任务队列管理
    • 支持多种打印格式
    • 打印任务状态跟踪
    • 归档打印的原始文件和标签
  • WADOURI 服务 (Web Access to DICOM Objects)

    • 必需参数

      • requestType: 必须为 "WADO"
      • studyUID: 研究实例 UID
      • seriesUID: 序列实例 UID
      • objectUID: 实例 UID
    • 可选参数

      • contentType: 返回内容类型 不传默认 image/jpeg

        • application/dicom: 返回 DICOM 格式
        • image/jpeg: 返回 JPEG 格式
      • transferSyntax: DICOM 传输语法 UID 不传默认不转码

        • 1.2.840.10008.1.2: Implicit VR Little Endian
        • 1.2.840.10008.1.2.1: Explicit VR Little Endian
        • 1.2.840.10008.1.2.4.50: JPEG Baseline
        • 1.2.840.10008.1.2.4.57: JPEG Lossless
        • 1.2.840.10008.1.2.4.70: JPEG Lossless SV1
        • 1.2.840.10008.1.2.4.90: JPEG 2000 Lossless
        • 1.2.840.10008.1.2.4.91: JPEG 2000 Lossy
        • 1.2.840.10008.1.2.4.80: JPEG-LS Lossless
        • 1.2.840.10008.1.2.5: RLE Lossless
      • anonymize: 是否匿名化

        • yes: 执行匿名化处理
        • 其他值或不传: 不进行匿名化
    • 完整请求参数例子

      http://localhost:5000/wado?requestType=WADO&studyUID=1.2.840.113704.1.111.5096.1719875982.1&seriesUID=1.3.46.670589.33.1.13252761201319485513.2557156297609063016&objectUID=1.3.46.670589.33.1.39304787935332940.2231985654917411587&contentType=application/dicom&transferSyntax=1.2.840.10008.1.2.4.70&anonymize=yes
      
  • CSTORE-SCU (CSTORE-SCU)

    • 支持发送DICOM图像到DICOM SCP
    • 可配置多个目标节点
  • Print-SCU (Print-SCU)

    • 支持将PRINTSCP接收到的图像打印到其他打印机或PRINTSCP服务
    • 构建打印图像会保留原始图像的标签信息
  • Log Service (日志服务)

    • 支持查看、下载、删除日志
    • 个服务日志独立配置
    • 多日志级别配置
    • 服务预置详细日志 方便对接查找问题
  • WADO-RS 服务 (Web Access to DICOM Objects - RESTful Services)

    • 实例检索 (Instance Retrieval)

      GET /dicomweb/studies/{studyUID}
      GET /dicomweb/studies/{studyUID}/series/{seriesUID}
      GET /dicomweb/studies/{studyUID}/series/{seriesUID}/instances/{instanceUID}
      
      • 支持原始 DICOM 格式检索
      • 支持传输语法转换
      • 支持 multipart/related 响应
      • 支持 Accept 头指定返回格式
      • 支持检查/序列/实例三个级别的检索
      • 支持 transfer-syntax 参数指定传输语法
    • 元数据检索 (Metadata Retrieval)

      GET /dicomweb/studies/{studyUID}/series/{seriesUID}/metadata
      
      • 返回 DICOM JSON 格式
      • 包含完整的 DICOM 标签信息
      • 支持 VR 和 Value 的标准格式
      • 符合 DICOMweb 规范的空值处理
    • 帧检索 (Frame Retrieval)

      GET /dicomweb/studies/{studyUID}/series/{seriesUID}/instances/{instanceUID}/frames/{frames}
      
      • 支持单帧/多帧提取
      • 保持原始像素数据
      • 支持传输语法转换
    • 缩略图服务 (Thumbnail)

      GET /dicomweb/studies/{studyUID}/series/{seriesUID}/thumbnail?size={size}
      GET /dicomweb/studies/{studyUID}/series/{seriesUID}/thumbnail?viewport={viewport}
      
      • 支持自定义尺寸
        • size: 指定输出图像大小(可选,默认 128)
        • viewport: 指定视口大小(可选,与 size 参数互斥)
      • 保持图像宽高比
      • JPEG 格式输出
      • 示例:
        /dicomweb/studies/1.2.3/series/4.5.6/thumbnail?size=256
        /dicomweb/studies/1.2.3/series/4.5.6/thumbnail?viewport=512
        
  • QIDO-RS 服务 (Query based on ID for DICOM Objects - RESTful Services)

    • 研究级查询 (Study Level Query)

      # DICOMweb 标准格式
      GET /dicomweb/studies?00100020={patientID}&00100010={patientName}&00080020={date}&00200010={accessionNumber}&0020000D={studyUID}&00080060={modality}&offset={offset}&limit={limit}&fuzzy=true
      
      # 友好格式(兼容)
      GET /dicomweb/studies?PatientID={patientID}&PatientName={patientName}&StudyDate={date}&AccessionNumber={accessionNumber}&StudyInstanceUID={studyUID}&Modality={modality}&offset={offset}&limit={limit}&fuzzy=true
      
      • 支持多种查询参数:
        • 标准 DICOM 标签格式:
          • 00100020: 患者 ID
          • 00100010: 患者姓名
          • 00080020: 检查日期
          • 00200010: 检查号
          • 0020000D: 检查实例 UID
          • 00080060: 检查类型/模态
        • 友好格式(等效):
          • PatientID: 精确匹配或模糊匹配 (例如: "P123*" 匹配所有以 P123 开头的ID)
          • PatientName: 支持通配符 (例如: "" 匹配包含"张"的姓名)
          • StudyDate: 支持日期范围 (例如: "20240101-20240131" 表示1月份的数据)
          • AccessionNumber: 检查号匹配
          • StudyInstanceUID: 检查实例 UID 精确匹配
          • Modality: 检查类型/模态 (例如: "CT" 或 "CT\MR" 支持多值)
          • fuzzy: 设置为 true 时启用模糊匹配
      • 支持分页功能(offset/limit)
      • 支持模糊匹配
      • 返回符合 DICOMweb 标准的 JSON 格式
    • 序列级查询 (Series Level Query)

      GET /dicomweb/studies/{studyUID}/series?SeriesInstanceUID={seriesUID}&Modality={modality}
      
      • 支持序列 UID 过滤
      • 支持模态过滤 (例如: "CT*" 匹配所有 CT 相关模态)
      • 返回序列详细信息
      • 符合 DICOMweb JSON 格式规范
    • 实例级查询 (Instance Level Query)

      GET /dicomweb/studies/{studyUID}/series/{seriesUID}/instances?SOPInstanceUID={instanceUID}
      
      • 支持 SOP 实例 UID 过滤
      • 返回实例详细信息
      • 包含图像参数信息

系统要求

  • Windows 10/11 或 Windows Server 2016+
  • .NET 8.0 或更高版本
  • SQLite 3.x
  • 4GB+ RAM
  • 10GB+ 可用磁盘空间
  • 现代浏览器(Chrome/Firefox/Edge)

快速开始

  1. 下载最新发布版本
  2. 修改 appsettings.json 配置文件
  3. 运行 DicomSCP.exe
  4. 访问 http://localhost:5000
  5. 默认账号 admin / admin

Docker部署

appsettings.json需要先在宿主机目录下创建好!

docker run -d --name DicomSCP --restart unless-stopped \
  -p 5000:5000 \
  -p 11112-11115:11112-11115 \
  -v /opt/docker/dicomscp/keys:/root/.aspnet/DataProtection-Keys \
  -v /opt/docker/dicomscp/logs:/app/logs \
  -v /opt/docker/dicomscp/received_files:/app/received_files \
  -v /opt/docker/dicomscp/temp_files:/app/temp_files \
  -v /opt/docker/dicomscp/appsettings.json:/app/appsettings.json \
  -v /opt/docker/dicomscp/db:/app/db \
  fightroad/dicomscp:latest

Nginx反向代理

proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_http_version 1.1;

技术栈

  • 后端框架:.NET Core
  • 前端框架:原生 JavaScript
  • DICOM 处理:fo-dicom、Cornerstone.js
  • 数据库:SQLite
  • HTTP 客户端:Axios
  • UI 组件:Bootstrap

使用的开源项目

本项目使用了以下优秀的开源项目:

后端

前端

感谢这些优秀的开源项目,让本项目得以实现!

赞助者

感谢以下赞助者的支持(排名不分先后):

  • 平凡之路
  • QQ名:生活
  • GITEE名:mmkangaroo

参与贡献

我们非常欢迎您的贡献!如果您有任何想法或建议:

  1. Fork 本仓库
  2. 创建您的特性分支
  3. 提交您的更改
  4. 推送到分支
  5. 打开一个 Pull Request

您也可以通过以下方式参与:

  • 提交 Bug 报告
  • 提出新功能建议
  • 改进文档
  • 分享使用经验

每一份贡献都将受到重视和感谢!

许可证

MIT License