You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pydicom中接收所有SOPClassUID图像并写入磁盘?

解决方法

问题原因

你遇到的错误 No supported service class available for the SOP Class UID 是因为:

  • 虽然你在关联协商中接受了所有Presentation Context,但pynetdicom需要为每个SOP类注册对应的服务类处理程序(handler)才能处理C-STORE请求。
  • 默认情况下,pynetdicom只提供标准DICOM SOP类的处理程序,对于自定义或未预定义的SOP类(如你的1.3.46.670589.2.5.1.1),没有内置处理逻辑。

实现步骤

要接收所有SOP类的图像并写入磁盘,需要完成两个核心操作:

  1. 创建通用的C-STORE处理程序,用于处理任意SOP类的存储请求
  2. 配置AE接受所有传入的Presentation Context

1. 编写通用C-STORE处理函数

这个函数会接收C-STORE事件,提取数据集并保存到磁盘:

def handle_store(event):
    # 获取传入的DICOM数据集
    ds = event.dataset
    # 添加文件元信息(确保保存的文件符合DICOM标准)
    ds.file_meta = event.file_meta
    
    # 以SOP实例UID作为文件名,避免重复
    filename = f"{ds.SOPInstanceUID}.dcm"
    # 保存文件,write_like_original=True保留原始传输语法
    ds.save_as(filename, write_like_original=True)
    
    # 返回成功状态码(0x0000表示操作成功)
    return 0x0000

2. 配置AE并启动SCP

设置AE接受所有Presentation Context,并绑定通用处理函数到C-STORE事件:

from pynetdicom import AE, evt

# 初始化AE
ae = AE()

# 设置接受所有传入的Presentation Context
ae.accept_all_presentation_contexts = True

# 绑定C-STORE事件到通用处理函数
handlers = [(evt.EVT_C_STORE, handle_store)]

# 启动SCP,监听指定端口和AE标题
ae.start_server(("0.0.0.0", 104), evt_handlers=handlers, ae_title="YOUR_AE_TITLE")

关键说明

  • ae.accept_all_presentation_contexts = True:让SCP自动接受所有客户端发起的Presentation Context协商请求,无需提前添加每个SOP类的支持上下文。
  • 使用evt.EVT_C_STORE事件绑定:这种方式会拦截所有C-STORE请求,无论对应的SOP类是否预定义,确保所有存储请求都能被处理。
  • 保存逻辑:使用SOP实例UID作为文件名可以保证每个文件唯一,避免覆盖。

验证

运行上述代码后,当客户端发送任意SOP类的C-STORE请求时:

  1. 关联协商会自动接受对应的Presentation Context
  2. C-STORE请求会被通用处理函数捕获并保存为DICOM文件到当前目录

内容的提问来源于stack exchange,提问作者ShoibAhamed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:37:46