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方法中设置的文件夹下