comparison OrthancFramework/Sources/DicomParsing/ParsedDicomFile.cpp @ 4947:dfbe764995cf

added ParsedDicomFile::DecodeAllOverlays()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 21 Mar 2022 08:59:20 +0100
parents 6a59dc426f93
children 1610e56cadfb
comparison
equal deleted inserted replaced
4946:51e4947aa3b3 4947:dfbe764995cf
1918 rescaleSlope = 1; 1918 rescaleSlope = 1;
1919 } 1919 }
1920 } 1920 }
1921 1921
1922 1922
1923 void ParsedDicomFile::ListOverlays(std::set<unsigned int>& groups) const 1923 void ParsedDicomFile::ListOverlays(std::set<uint16_t>& groups) const
1924 { 1924 {
1925 DcmDataset& dataset = *const_cast<ParsedDicomFile&>(*this).GetDcmtkObject().getDataset(); 1925 DcmDataset& dataset = *const_cast<ParsedDicomFile&>(*this).GetDcmtkObject().getDataset();
1926 1926
1927 // "Repeating Groups shall only be allowed in the even Groups (6000-601E,eeee)" 1927 // "Repeating Groups shall only be allowed in the even Groups (6000-601E,eeee)"
1928 // https://dicom.nema.org/medical/dicom/2021e/output/chtml/part05/sect_7.6.html 1928 // https://dicom.nema.org/medical/dicom/2021e/output/chtml/part05/sect_7.6.html
1951 } 1951 }
1952 1952
1953 1953
1954 ImageAccessor* ParsedDicomFile::DecodeOverlay(int& originX, 1954 ImageAccessor* ParsedDicomFile::DecodeOverlay(int& originX,
1955 int& originY, 1955 int& originY,
1956 unsigned int group) const 1956 uint16_t group) const
1957 { 1957 {
1958 // https://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.9.2.html 1958 // https://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.9.2.html
1959 1959
1960 DcmDataset& dataset = *const_cast<ParsedDicomFile&>(*this).GetDcmtkObject().getDataset(); 1960 DcmDataset& dataset = *const_cast<ParsedDicomFile&>(*this).GetDcmtkObject().getDataset();
1961 1961
2012 throw OrthancException(ErrorCode_CorruptedFile, "Invalid overlay"); 2012 throw OrthancException(ErrorCode_CorruptedFile, "Invalid overlay");
2013 } 2013 }
2014 } 2014 }
2015 2015
2016 2016
2017 ImageAccessor* ParsedDicomFile::DecodeAllOverlays(int& originX,
2018 int& originY) const
2019 {
2020 std::set<uint16_t> groups;
2021 ListOverlays(groups);
2022
2023 if (groups.empty())
2024 {
2025 originX = 0;
2026 originY = 0;
2027 return new Image(PixelFormat_Grayscale8, 0, 0, false);
2028 }
2029 else
2030 {
2031 std::set<uint16_t>::const_iterator it = groups.begin();
2032 assert(it != groups.end());
2033
2034 std::unique_ptr<ImageAccessor> result(DecodeOverlay(originX, originY, *it));
2035 assert(result.get() != NULL);
2036 ++it;
2037
2038 int right = originX + static_cast<int>(result->GetWidth());
2039 int bottom = originY + static_cast<int>(result->GetHeight());
2040
2041 while (it != groups.end())
2042 {
2043 int ox, oy;
2044 std::unique_ptr<ImageAccessor> overlay(DecodeOverlay(ox, oy, *it));
2045 assert(overlay.get() != NULL);
2046
2047 int mergedX = std::min(originX, ox);
2048 int mergedY = std::min(originY, oy);
2049 right = std::max(right, ox + static_cast<int>(overlay->GetWidth()));
2050 bottom = std::max(bottom, oy + static_cast<int>(overlay->GetHeight()));
2051
2052 assert(right >= mergedX && bottom >= mergedY);
2053 unsigned int width = static_cast<unsigned int>(right - mergedX);
2054 unsigned int height = static_cast<unsigned int>(bottom - mergedY);
2055
2056 std::unique_ptr<ImageAccessor> merged(new Image(PixelFormat_Grayscale8, width, height, false));
2057 ImageProcessing::Set(*merged, 0);
2058
2059 ImageAccessor a;
2060 merged->GetRegion(a, originX - mergedX, originY - mergedY, result->GetWidth(), result->GetHeight());
2061 ImageProcessing::Maximum(a, *result);
2062
2063 merged->GetRegion(a, ox - mergedX, oy - mergedY, overlay->GetWidth(), overlay->GetHeight());
2064 ImageProcessing::Maximum(a, *overlay);
2065
2066 originX = mergedX;
2067 originY = mergedY;
2068 result.reset(merged.release());
2069
2070 ++it;
2071 }
2072
2073 return result.release();
2074 }
2075 }
2076
2077
2017 #if ORTHANC_BUILDING_FRAMEWORK_LIBRARY == 1 2078 #if ORTHANC_BUILDING_FRAMEWORK_LIBRARY == 1
2018 // Alias for binary compatibility with Orthanc Framework 1.7.2 => don't use it anymore 2079 // Alias for binary compatibility with Orthanc Framework 1.7.2 => don't use it anymore
2019 void ParsedDicomFile::DatasetToJson(Json::Value& target, 2080 void ParsedDicomFile::DatasetToJson(Json::Value& target,
2020 DicomToJsonFormat format, 2081 DicomToJsonFormat format,
2021 DicomToJsonFlags flags, 2082 DicomToJsonFlags flags,