weimei521 2023-06-05 15:29 采纳率: 33.3%
浏览 45
已结题

Java 使用dcm4che的工具类下载pacs数据

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类将数据流式传输到本地文件系统中的文件中。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月20日
  • 已采纳回答 6月12日
  • 创建了问题 6月5日