Java 如何使用dcm4che的工具类下载pacs数据,是movescu还是getscu,如何使用getscu,本地ae信息需要配置吗,有偿请教
以下是使用dcm4che的工具类下载PACS数据的示例代码:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.dcm4che3.data.Attributes;
import org.dcm4che3.data.Tag;
import org.dcm4che3.data.UID;
import org.dcm4che3.io.DicomInputStream;
import org.dcm4che3.net.ApplicationEntity;
import org.dcm4che3.net.Connection;
import org.dcm4che3.net.Device;
import org.dcm4che3.net.MoveDestination;
import org.dcm4che3.net.NetworkException;
import org.dcm4che3.net.PDVInputStream;
import org.dcm4che3.net.QueryRetrieveLevel;
import org.dcm4che3.net.ServiceException;
import org.dcm4che3.net.TransferCapability;
import org.dcm4che3.net.TransferSyntax;
public class PacsDownloader {
private final Device device = new Device("my-device");
private final ApplicationEntity ae = new ApplicationEntity("my-ae");
private final Connection conn = new Connection();
public PacsDownloader(String host, int port, String callingAETitle) {
ae.addConnection(conn);
ae.setAETitle(callingAETitle);
device.addApplicationEntity(ae);
conn.setHostname(host);
conn.setPort(port);
}
public void downloadStudy(String studyInstanceUID, String outputPath) throws IOException, ServiceException, NetworkException {
MoveDestination destination = new MoveDestination(ae.getAETitle(), conn.getHostname(), conn.getPort());
List<TransferCapability> capabilities = ae.getTransferCapabilities();
for (TransferCapability capability : capabilities) {
if (capability.getSopClass().equals(UID.StudyRootQueryRetrieveInformationModelMOVE)) {
Capability moveCapability = new Capability(capability.getSopClass(), capability.getTransferSyntaxes());
device.addMoveDestination(destination, moveCapability);
break;
}
}
device.setAssociationInitiator(ae);
device.setPackPDV(true);
device.setRetrieveTimeout(0);
device.setCalledAET(destination.getAETitle());
device.connect(conn);
try {
device.bind();
Attributes attrs = new Attributes();
attrs.setString(Tag.QueryRetrieveLevel, VR.CS, QueryRetrieveLevel.STUDY.name());
attrs.setString(Tag.StudyInstanceUID, VR.UI, studyInstanceUID);
attrs.setString(Tag.PatientID, VR.LO, "");
attrs.setString(Tag.PatientName, VR.PN, "");
attrs.setString(Tag.StudyID, VR.SH, "");
attrs.setString(Tag.AccessionNumber, VR.SH, "");
attrs.setString(Tag.SOPInstanceUID, VR.UI, "");
attrs.setString(Tag.ModalitiesInStudy, VR.CS, "");
DicomInputStream dis = new DicomInputStream(device.move(
destination.getAETitle(), destination.getHostname(), destination.getPort(),
ae.getAETitle(), UID.StudyRootQueryRetrieveInformationModelMOVE, attrs,
TransferSyntax.ImplicitVRLittleEndian, this));
try {
File outputDir = new File(outputPath);
outputDir.mkdirs();
Attributes fmi = dis.readFileMetaInformation();
Attributes attrs;
while ((attrs = dis.readDataset(fmi, -1, Tag.PixelData)) != null) {
String sopInstanceUID = attrs.getString(Tag.SOPInstanceUID);
String fileName = outputDir.getAbsolutePath() + File.separator + sopInstanceUID + ".dcm";
try (FileOutputStream fos = new FileOutputStream(fileName)) {
PDVInputStream pdvIs = new PDVInputStream(dis);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = pdvIs.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
}
}
} finally {
dis.close();
}
} finally {
device.unbind();
}
}
public static void main(String[] args) throws Exception {
String host = "localhost";
int port = 11112;
String callingAETitle = "my-ae";
String studyInstanceUID = "1.2.3.4.5"; // replace with actual study instance UID String outputPath = "/path/to/output/directory";
PacsDownloader downloader = new PacsDownloader(host, port, callingAETitle);
downloader.downloadStudy(studyInstanceUID, outputPath);
}
}
在上述代码中,我们使用dcm4che的Device和ApplicationEntity类创建了一个DICOM设备和应用程序实体。我们使用Connection类指定了PACS服务器的主机名和端口号,并在ApplicationEntity中添加了一个连接。我们使用TransferCapability类指定了我们要使用的传输能力。然后,我们将DICOM设备绑定到PACS服务器,并使用move方法从PACS服务器中检索数据。在检索数据时,我们使用DcmInputStream类和PDVInputStream类将数据流式传输到本地文件系统中的文件中。