Mercurial > hg > orthanc
comparison OrthancFramework/Sources/DicomFormat/DicomStreamReader.cpp @ 5324:e95caa87fed8
only store PixelDataVR metadata if needed
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Sun, 25 Jun 2023 15:19:25 +0200 |
parents | 03501a258d9e |
children | 48b8dae6dc77 |
comparison
equal
deleted
inserted
replaced
5323:138e9d0c08c1 | 5324:e95caa87fed8 |
---|---|
580 { | 580 { |
581 private: | 581 private: |
582 bool hasPixelData_; | 582 bool hasPixelData_; |
583 uint64_t pixelDataOffset_; | 583 uint64_t pixelDataOffset_; |
584 ValueRepresentation pixelDataVR_; | 584 ValueRepresentation pixelDataVR_; |
585 DicomTransferSyntax transferSyntax_; | |
585 | 586 |
586 public: | 587 public: |
587 PixelDataVisitor() : | 588 PixelDataVisitor() : |
588 hasPixelData_(false), | 589 hasPixelData_(false), |
589 pixelDataOffset_(0), | 590 pixelDataOffset_(0), |
590 pixelDataVR_(ValueRepresentation_Unknown) | 591 pixelDataVR_(ValueRepresentation_Unknown), |
592 transferSyntax_(DicomTransferSyntax_LittleEndianImplicit) // Default DICOM transfer syntax | |
591 { | 593 { |
592 } | 594 } |
593 | 595 |
594 virtual void VisitMetaHeaderTag(const DicomTag& tag, | 596 virtual void VisitMetaHeaderTag(const DicomTag& tag, |
595 const ValueRepresentation& vr, | 597 const ValueRepresentation& vr, |
597 { | 599 { |
598 } | 600 } |
599 | 601 |
600 virtual void VisitTransferSyntax(DicomTransferSyntax transferSyntax) ORTHANC_OVERRIDE | 602 virtual void VisitTransferSyntax(DicomTransferSyntax transferSyntax) ORTHANC_OVERRIDE |
601 { | 603 { |
604 transferSyntax_ = transferSyntax; | |
602 } | 605 } |
603 | 606 |
604 virtual bool VisitDatasetTag(const DicomTag& tag, | 607 virtual bool VisitDatasetTag(const DicomTag& tag, |
605 const ValueRepresentation& vr, | 608 const ValueRepresentation& vr, |
606 const std::string& value, | 609 const std::string& value, |
609 { | 612 { |
610 if (tag == DICOM_TAG_PIXEL_DATA) | 613 if (tag == DICOM_TAG_PIXEL_DATA) |
611 { | 614 { |
612 hasPixelData_ = true; | 615 hasPixelData_ = true; |
613 pixelDataOffset_ = fileOffset; | 616 pixelDataOffset_ = fileOffset; |
614 pixelDataVR_ = vr; | 617 |
618 if (transferSyntax_ == DicomTransferSyntax_LittleEndianImplicit) | |
619 { | |
620 // Implicit Little Endian has always "OW" VR for pixel data | |
621 // https://dicom.nema.org/medical/dicom/current/output/chtml/part05/chapter_A.html | |
622 pixelDataVR_ = ValueRepresentation_OtherWord; | |
623 } | |
624 else if (transferSyntax_ == DicomTransferSyntax_LittleEndianExplicit || | |
625 transferSyntax_ == DicomTransferSyntax_BigEndianExplicit) | |
626 { | |
627 pixelDataVR_ = vr; | |
628 } | |
629 else | |
630 { | |
631 // Compressed transfer syntaxes must always be OB | |
632 pixelDataVR_ = ValueRepresentation_OtherByte; | |
633 } | |
615 } | 634 } |
616 | 635 |
617 // Stop processing once pixel data has been passed | 636 // Stop processing once pixel data has been passed |
618 return (tag < DICOM_TAG_PIXEL_DATA); | 637 return (tag < DICOM_TAG_PIXEL_DATA); |
619 } | 638 } |