使用dcm4che-tool-storescp做影像存储服务

dcm4che-tool-storescp

github上有开源项目
https://github.com/dcm4che/dcm4che/tree/master/dcm4che-tool/dcm4che-tool-storescp

步骤

1.引入依赖

		 <dependency>
            <groupId>org.dcm4che</groupId>
            <artifactId>dcm4che-core</artifactId>
            <version>5.22.5</version>
        </dependency>
        
		<dependency>
            <groupId>org.dcm4che</groupId>
            <artifactId>dcm4che-net</artifactId>
            <version>5.22.5</version>
        </dependency>
        
        <dependency>
            <groupId>org.dcm4che.tool</groupId>
            <artifactId>dcm4che-tool-common</artifactId>
            <version>5.22.5</version>
        </dependency>      

2.代码

创建一个StoreScpTool工具类

公共变量

	private final Device device = new Device("storescp");
	private final ApplicationEntity ae = new ApplicationEntity("*");
	private final Connection conn = new Connection();
	private File storageDir;
	private int status;

构造方法

	private StoreScpTool() {
		device.setDimseRQHandler(createServiceRegistry());
		device.addConnection(conn);
		device.addApplicationEntity(ae);
		ae.setAssociationAcceptor(true);
		ae.addConnection(conn);
	}

创建存储服务

	private DicomServiceRegistry createServiceRegistry() {
		DicomServiceRegistry serviceRegistry = new DicomServiceRegistry();
		serviceRegistry.addDicomService(cstoreSCP);
		return serviceRegistry;
	}

配置连接信息

	/**
	 * @param ip      ip
	 * @param port    端口
	 * @param AETitle AETitle
	 */
	private void configureBindServer(String ip, int port, String AETitle) {
		this.conn.setHostname(ip); // 设置IP
		this.conn.setPort(port); // 设置端口
		this.ae.setAETitle(AETitle); // 设置AETitle
	}

设置返回C-STORE中的状态码,默认0

	private void setStatus() {
		this.status = 0;
	}

设置TransferCapability

	private void configureTransferCapability() {
		this.ae.addTransferCapability(new TransferCapability(null, "*", TransferCapability.Role.SCP, "*"));
	}

配置存储DICOM文件路径

	private void configureStorageDirectory(String storageDirectory) {
		File file = new File(storageDirectory);
		if (!file.exists()) {
			file.mkdirs();
		}
		this.storageDir = file;
	}

配置线程池

	private void configureThreadPool() {
		ExecutorService executorService = Executors.newCachedThreadPool();
		ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
		this.device.setScheduledExecutor(scheduledExecutorService);
		this.device.setExecutor(executorService);
	}

创建连接

	private void start() {
		try {
			this.device.bindConnections();
		} catch (IOException | GeneralSecurityException e) {
			System.err.println("storescp: " + e.getMessage());
		}
	}

存储DICOM的核心方法

	private final BasicCStoreSCP cstoreSCP = new BasicCStoreSCP("*") {
		@Override
		protected void store(Association as, PresentationContext pc, Attributes rq, PDVInputStream data, Attributes rsp)
				throws IOException {
			rsp.setInt(Tag.Status, VR.US, status);
			String cuid = rq.getString(Tag.AffectedSOPClassUID);
			String iuid = rq.getString(Tag.AffectedSOPInstanceUID);
			String tsuid = pc.getTransferSyntax();
			File file = new File(storageDir, iuid + ".DCM");
			try {
				DicomOutputStream out = new DicomOutputStream(file);
				try {
					out.writeFileMetaInformation(as.createFileMetaInformation(iuid, cuid, tsuid));
					data.copyTo(out);
				} finally {
					SafeClose.close(out);
				}
			} catch (Exception e) {
				throw new DicomServiceException(Status.ProcessingFailure, e);
			}
		}
	};

对外开放启动storescp服务的方法

	public static void createService(String ip, int port, String AETitle, String storageDirectory) {
		StoreScpTool storeScpUtil = new StoreScpTool();
		storeScpUtil.configureBindServer(ip, port, AETitle); // 配置连接信息
		storeScpUtil.setStatus(); // 设置返回C-STORE中的状态码,默认0
		storeScpUtil.configureTransferCapability();
		storeScpUtil.configureStorageDirectory(storageDirectory); // 配置存储DICOM文件路径
		storeScpUtil.configureThreadPool(); // 配置线程池
		storeScpUtil.start(); // 创建连接
	}

3.测试

运行main方法,启动storescp服务

	public static void main(String[] args) {
		StoreScpTool.createService("127.0.0.1", 11115, "DCM4CHE", "D:\\temp");
	}

到dcm4che-5.22.5的bin目录下进入cmd
在这里插入图片描述
输入命令 storescu -c aet@host:port file or directory (利用storescu将某个dicom文件或者某个文件夹下所有的dicom文件传输到storescp并存储)

在这里插入图片描述
执行后查看存储结果

在这里插入图片描述
文件已经存储到main方法中设置的文件夹下

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值