0

我正在尝试“在”传入关联请求期间读取(然后存储到第 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) {
    ...
}

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

但是,无论我在哪里尝试放置一段试图操纵(刚开始阅读)数据流的代码,那么我的 dicom 文件就会损坏!

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

即使我尝试只放一个:

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

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

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

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

4

1 回答 1

1

The PDVInputStream is probably a PDUDecoder class. You'll have to reset the position when using the input stream multiple times.

Maybe a better solution would be to store the DICOM object in memory and use that for both purposes. Something akin to:

DicomObject dcmobj = dataStream.readDataset();
String whatYouWant = dcmobj.get( Tag.whatever );
dcmobj.initFileMetaInformation( transferSyntaxUID );
outStream.writeDicomFile( dcmobj );
于 2014-12-02T18:53:50.307 回答