java - 在 onCStoreRQ 关联请求上读取 PDVInputStream dicomObject 信息

标签 java dicom dcm4che

我正在尝试在传入关联请求“期间”读取(然后存储到第 3 方本地数据库)某些 DICOM 对象标签。

为了接受关联请求并在本地存储我的 dicom 文件,我使用了 dcmrcv() 工具的修改版本。更具体地说,我重写了 onCStoreRQ 方法,例如:

@Override
protected void onCStoreRQ(Association association, int pcid, DicomObject dcmReqObj,
                                PDVInputStream dataStream, String transferSyntaxUID,
                                DicomObject dcmRspObj)
            throws DicomServiceException, IOException {

    final String classUID = dcmReqObj.getString(Tag.AffectedSOPClassUID);
    final String instanceUID = dcmReqObj.getString(Tag.AffectedSOPInstanceUID);

    config = new GlobalConfig();
    final File associationDir = config.getAssocDirFile();

    final String prefixedFileName = instanceUID;
    final String dicomFileBaseName = prefixedFileName + DICOM_FILE_EXTENSION;
    File dicomFile = new File(associationDir, dicomFileBaseName);
    assert !dicomFile.exists();

    final BasicDicomObject fileMetaDcmObj = new BasicDicomObject();
    fileMetaDcmObj.initFileMetaInformation(classUID, instanceUID, transferSyntaxUID);
    final DicomOutputStream outStream = new DicomOutputStream(new BufferedOutputStream(new FileOutputStream(dicomFile), 600000));

    //i would like somewhere here to extract some TAGS from incoming dicom object. By trying to do it using dataStream my dicom files
    //are getting corrupted!
    //System.out.println("StudyInstanceUID: " + dataStream.readDataset().getString(Tag.StudyInstanceUID));

    try {
        outStream.writeFileMetaInformation(fileMetaDcmObj);
        dataStream.copyTo(outStream);

    } finally {

        outStream.close();  
    }
        dicomFile.renameTo(new File(associationDir, dicomFileBaseName));
        System.out.println("DICOM file name: " + dicomFile.getName());
    }

    @Override
    public void associationAccepted(final AssociationAcceptEvent associationAcceptEvent) {
    ....
    @Override
    public void associationClosed(final AssociationCloseEvent associationCloseEvent) {
    ...
}

我想在这段代码之间的某个地方拦截一个方法,该方法将读取数据流并解析特定标签并存储到本地数据库。

但是,无论我尝试放置一段尝试操作(仅读取开始)数据流的代码,我的 dicom 文件都会损坏!

PDVInputStream 正在实现 java.io.InputStream ....

即使我尝试只输入:

System.out.println("StudyInstanceUID: "+ dataStream.readDataset().getString(Tag.StudyInstanceUID));

在将数据流复制到 outStream 之前...然后我的 dicom 文件已损坏(大小为 1KB)...

我应该如何在 CStoreRQ 关联请求中使用数据流来提取一些信息?

我希望我的问题很清楚......

最佳答案

PDVInputStream 可能是一个 PDUDecoder 类。多次使用输入流时,您必须重置位置。

也许更好的解决方案是将 DICOM 对象存储在内存中并将其用于两个目的。类似于:

DicomObject dcmobj = dataStream.readDataset();
String whatYouWant = dcmobj.get( Tag.whatever );
dcmobj.initFileMetaInformation( transferSyntaxUID );
outStream.writeDicomFile( dcmobj );

关于java - 在 onCStoreRQ 关联请求上读取 PDVInputStream dicomObject 信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27030667/

相关文章:

java - Java 约定中的 Getters 和 Setters

java - 解决 Play 2 Java Framework 中子项目和根项目之间的模板名称冲突

python - 如何对使用 SimpleITK 读取的 DICOM 图像进行直方图均衡化

image - 如何在 MATLAB 7.0 版本中读取和写入 DICOM 图像?

java - 如何在 Java 中使用 dcm4che3 创建 DICOM MWL 查询?

java - 在 dcm4che 中运行 dcmqrscp 的示例命令,找不到什么文件?

java - getResource() 无法加载 jar 中的内容

java - PMD 规则的不同阈值级别

c# - .Net 4.0 中的 ISO_IR 58 支持

java - dcm4che - 标签是 "8 byte integer"?