2014-11-20 1 views
0

들어오는 연결 요청 중 "DICOM"특정 개체 태그를 읽으려고 시도하고 있습니다 (제 3 자 로컬 db에 저장).onCStoreRQ 연결 요청에 대한 PDVInputStream dicomObject 정보 읽기

연관 요청을 수락하고 로컬로 내 dicom 파일을 저장하는 데 dcmrcv() 도구의 수정 된 버전을 사용했습니다. 나는 데이터 스트림을 읽어들이는 방법 느릅 나무를 가로 챌 곳이 코드 사이 싶습니다 로컬 데이터베이스에 특정 태그를 구문 분석하고 저장합니다

@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) { 
    ... 
} 

:처럼 더 구체적으로 내가 onCStoreRQ 오버라이드 (override) 한 방법.

그러나 어디서나 (단지 시작 읽기) dataStream을 조작하려고하는 코드 조각을 넣으려고하면 내 dicom 파일이 손상됩니다! 난 그냥 넣어하려고해도

PDVInputStream는 ....

을 java.io.InputStream를 구현한다 :

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

outStream에 데이터 스트림을 복사하기 전에 ... 다음 내 DICOM 파일은

어떻게 내가 몇 가지 정보를 추출하기 위해 CStoreRQ 협회의 요청에 데이터 스트림을 사용 하죠 ... (크기의 1킬로바이트) 손상 얻고있다? 내 질문은 분명하다 희망

...

답변

1

PDVInputStream 아마 PDUDecoder 클래스입니다. 입력 스트림을 여러 번 사용할 때 위치를 재설정해야합니다.

더 나은 해결책은 DICOM 개체를 메모리에 저장하고 두 가지 용도로 사용하는 것일 수 있습니다. 다음과 비슷한 항목 :

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