Java 如何使用dcm4che的工具类下载pacs数据,是movescu还是getscu,如何使用getscu,本地ae信息需要配置吗,有偿请教
1条回答 默认 最新
Java&Develop 2023-06-06 14:49关注以下是使用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类将数据流式传输到本地文件系统中的文件中。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报