Mercurial > hg > orthanc-wsi
annotate Framework/Inputs/DicomPyramidInstance.cpp @ 223:443f219a68fd
sync, compatibility with Orthanc framework 1.8.2
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 13 Jan 2021 09:23:22 +0100 |
parents | ef3f8c5126a4 |
children | 4eefa34657f0 |
rev | line source |
---|---|
0 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
214
1e864138f0da
upgrade to year 2021
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
213
diff
changeset
|
5 * Copyright (C) 2017-2021 Osimis S.A., Belgium |
0 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
16
7a88c614be04
preparing for precompiled headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
22 #include "../PrecompiledHeadersWSI.h" |
0 | 23 #include "DicomPyramidInstance.h" |
24 | |
194 | 25 #include "../DicomToolbox.h" |
223
443f219a68fd
sync, compatibility with Orthanc framework 1.8.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
219
diff
changeset
|
26 #include "../../Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h" |
196
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
27 #include "../../Resources/Orthanc/Stone/DicomDatasetReader.h" |
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
28 #include "../../Resources/Orthanc/Stone/FullOrthancDataset.h" |
194 | 29 |
192 | 30 #include <Logging.h> |
31 #include <OrthancException.h> | |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
32 #include <SerializationToolbox.h> |
192 | 33 #include <Toolbox.h> |
34 | |
0 | 35 #include <cassert> |
36 | |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
37 #define SERIALIZED_METADATA "4201" // Was "4200" if versions <= 0.7 of this plugin |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
38 |
196
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
39 |
0 | 40 namespace OrthancWSI |
41 { | |
196
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
42 static const Orthanc::DicomTag DICOM_TAG_COLUMN_POSITION_IN_TOTAL_IMAGE_PIXEL_MATRIX(0x0048, 0x021e); |
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
43 static const Orthanc::DicomTag DICOM_TAG_PER_FRAME_FUNCTIONAL_GROUPS_SEQUENCE(0x5200, 0x9230); |
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
44 static const Orthanc::DicomTag DICOM_TAG_PLANE_POSITION_SLIDE_SEQUENCE(0x0048, 0x021a); |
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
45 static const Orthanc::DicomTag DICOM_TAG_ROW_POSITION_IN_TOTAL_IMAGE_PIXEL_MATRIX(0x0048, 0x021f); |
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
46 static const Orthanc::DicomTag DICOM_TAG_TOTAL_PIXEL_MATRIX_COLUMNS(0x0048, 0x0006); |
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
47 static const Orthanc::DicomTag DICOM_TAG_TOTAL_PIXEL_MATRIX_ROWS(0x0048, 0x0007); |
219
ef3f8c5126a4
Don't display the thumbnail/overview instances in the Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
217
diff
changeset
|
48 static const Orthanc::DicomTag DICOM_TAG_IMAGE_TYPE(0x0008, 0x0008); |
196
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
49 |
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
50 static ImageCompression DetectImageCompression(OrthancStone::IOrthancConnection& orthanc, |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
51 const std::string& instanceId) |
0 | 52 { |
196
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
53 using namespace OrthancStone; |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
54 |
87 | 55 FullOrthancDataset dataset(orthanc, "/instances/" + instanceId + "/header"); |
56 DicomDatasetReader header(dataset); | |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
57 |
0 | 58 std::string s = Orthanc::Toolbox::StripSpaces |
213
2a4e1f7de5ab
remove calls to deprecated classes of JsonCpp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
59 (header.GetMandatoryStringValue(OrthancStone::DicomPath(Orthanc::DICOM_TAG_TRANSFER_SYNTAX_UID))); |
0 | 60 |
61 if (s == "1.2.840.10008.1.2" || | |
62 s == "1.2.840.10008.1.2.1") | |
63 { | |
64 return ImageCompression_None; | |
65 } | |
66 else if (s == "1.2.840.10008.1.2.4.50") | |
67 { | |
68 return ImageCompression_Jpeg; | |
69 } | |
70 else if (s == "1.2.840.10008.1.2.4.90" || | |
71 s == "1.2.840.10008.1.2.4.91") | |
72 { | |
73 return ImageCompression_Jpeg2000; | |
74 } | |
75 else | |
76 { | |
77 LOG(ERROR) << "Unsupported transfer syntax: " << s; | |
78 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
79 } | |
80 } | |
81 | |
82 | |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
83 static void DetectPixelFormat(Orthanc::PixelFormat& format, |
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
84 Orthanc::PhotometricInterpretation& photometric, |
216 | 85 const OrthancStone::DicomDatasetReader& reader) |
0 | 86 { |
196
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
87 using namespace OrthancStone; |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
88 |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
89 std::string p = Orthanc::Toolbox::StripSpaces |
213
2a4e1f7de5ab
remove calls to deprecated classes of JsonCpp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
90 (reader.GetMandatoryStringValue(OrthancStone::DicomPath(Orthanc::DICOM_TAG_PHOTOMETRIC_INTERPRETATION))); |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
91 |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
92 photometric = Orthanc::StringToPhotometricInterpretation(p.c_str()); |
0 | 93 |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
94 if (photometric == Orthanc::PhotometricInterpretation_Palette) |
0 | 95 { |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
96 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, |
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
97 "Unsupported photometric interpretation: " + p); |
0 | 98 } |
99 | |
89 | 100 unsigned int bitsStored, samplesPerPixel, tmp; |
101 | |
213
2a4e1f7de5ab
remove calls to deprecated classes of JsonCpp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
102 if (!reader.GetUnsignedIntegerValue(bitsStored, OrthancStone::DicomPath(Orthanc::DICOM_TAG_BITS_STORED)) || |
2a4e1f7de5ab
remove calls to deprecated classes of JsonCpp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
103 !reader.GetUnsignedIntegerValue(samplesPerPixel, OrthancStone::DicomPath(Orthanc::DICOM_TAG_SAMPLES_PER_PIXEL)) || |
2a4e1f7de5ab
remove calls to deprecated classes of JsonCpp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
104 !reader.GetUnsignedIntegerValue(tmp, OrthancStone::DicomPath(Orthanc::DICOM_TAG_PIXEL_REPRESENTATION))) |
89 | 105 { |
106 throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentTag); | |
107 } | |
108 | |
109 bool isSigned = (tmp != 0); | |
0 | 110 |
111 if (bitsStored == 8 && | |
112 samplesPerPixel == 1 && | |
113 !isSigned) | |
114 { | |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
115 format = Orthanc::PixelFormat_Grayscale8; |
0 | 116 } |
117 else if (bitsStored == 8 && | |
118 samplesPerPixel == 3 && | |
119 !isSigned) | |
120 { | |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
121 format = Orthanc::PixelFormat_RGB24; |
0 | 122 } |
123 else | |
124 { | |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
125 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, "Unsupported pixel format"); |
0 | 126 } |
127 } | |
128 | |
56
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
129 |
196
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
130 ImageCompression DicomPyramidInstance::GetImageCompression(OrthancStone::IOrthancConnection& orthanc) |
56
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
131 { |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
132 /** |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
133 * Lazy detection of the image compression using the transfer |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
134 * syntax stored inside the DICOM header. Given the fact that |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
135 * reading the header is a time-consuming operation (it implies |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
136 * the decoding of the DICOM image by Orthanc, whereas the "/tags" |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
137 * endpoint only reads the "DICOM-as-JSON" attachment), the |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
138 * "/header" REST call is delayed until it is really required. |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
139 **/ |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
140 |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
141 if (!hasCompression_) |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
142 { |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
143 compression_ = DetectImageCompression(orthanc, instanceId_); |
56
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
144 hasCompression_ = true; |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
145 } |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
146 |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
147 return compression_; |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
148 } |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
149 |
0 | 150 |
196
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
151 void DicomPyramidInstance::Load(OrthancStone::IOrthancConnection& orthanc, |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
152 const std::string& instanceId) |
0 | 153 { |
196
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
154 using namespace OrthancStone; |
0 | 155 |
87 | 156 FullOrthancDataset dataset(orthanc, "/instances/" + instanceId + "/tags"); |
157 DicomDatasetReader reader(dataset); | |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
158 |
213
2a4e1f7de5ab
remove calls to deprecated classes of JsonCpp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
159 if (reader.GetMandatoryStringValue(OrthancStone::DicomPath(Orthanc::DICOM_TAG_SOP_CLASS_UID)) != "1.2.840.10008.5.1.4.1.1.77.1.6" || |
2a4e1f7de5ab
remove calls to deprecated classes of JsonCpp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
160 reader.GetMandatoryStringValue(OrthancStone::DicomPath(Orthanc::DICOM_TAG_MODALITY)) != "SM") |
0 | 161 { |
162 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
163 } | |
164 | |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
165 hasCompression_ = false; |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
166 DetectPixelFormat(format_, photometric_, reader); |
89 | 167 |
168 unsigned int tmp; | |
213
2a4e1f7de5ab
remove calls to deprecated classes of JsonCpp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
169 if (!reader.GetUnsignedIntegerValue(tileWidth_, OrthancStone::DicomPath(Orthanc::DICOM_TAG_COLUMNS)) || |
2a4e1f7de5ab
remove calls to deprecated classes of JsonCpp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
170 !reader.GetUnsignedIntegerValue(tileHeight_, OrthancStone::DicomPath(Orthanc::DICOM_TAG_ROWS)) || |
2a4e1f7de5ab
remove calls to deprecated classes of JsonCpp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
171 !reader.GetUnsignedIntegerValue(totalWidth_, OrthancStone::DicomPath(DICOM_TAG_TOTAL_PIXEL_MATRIX_COLUMNS)) || |
2a4e1f7de5ab
remove calls to deprecated classes of JsonCpp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
172 !reader.GetUnsignedIntegerValue(totalHeight_, OrthancStone::DicomPath(DICOM_TAG_TOTAL_PIXEL_MATRIX_ROWS)) || |
2a4e1f7de5ab
remove calls to deprecated classes of JsonCpp
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
196
diff
changeset
|
173 !reader.GetUnsignedIntegerValue(tmp, OrthancStone::DicomPath(Orthanc::DICOM_TAG_NUMBER_OF_FRAMES))) |
89 | 174 { |
175 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
176 } | |
0 | 177 |
219
ef3f8c5126a4
Don't display the thumbnail/overview instances in the Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
217
diff
changeset
|
178 imageType_ = reader.GetStringValue(OrthancStone::DicomPath(DICOM_TAG_IMAGE_TYPE), ""); |
ef3f8c5126a4
Don't display the thumbnail/overview instances in the Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
217
diff
changeset
|
179 |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
180 size_t countFrames; |
215
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
181 if (reader.GetDataset().GetSequenceSize(countFrames, OrthancStone::DicomPath(DICOM_TAG_PER_FRAME_FUNCTIONAL_GROUPS_SEQUENCE))) |
0 | 182 { |
215
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
183 if (countFrames != tmp) |
89 | 184 { |
215
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
185 LOG(ERROR) << "Mismatch between the number of frames in instance: " << instanceId; |
0 | 186 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
187 } | |
188 | |
215
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
189 frames_.resize(countFrames); |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
190 |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
191 for (size_t i = 0; i < countFrames; i++) |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
192 { |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
193 DicomPath pathX(DICOM_TAG_PER_FRAME_FUNCTIONAL_GROUPS_SEQUENCE, i, |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
194 DICOM_TAG_PLANE_POSITION_SLIDE_SEQUENCE, 0, |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
195 DICOM_TAG_COLUMN_POSITION_IN_TOTAL_IMAGE_PIXEL_MATRIX); |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
196 |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
197 DicomPath pathY(DICOM_TAG_PER_FRAME_FUNCTIONAL_GROUPS_SEQUENCE, i, |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
198 DICOM_TAG_PLANE_POSITION_SLIDE_SEQUENCE, 0, |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
199 DICOM_TAG_ROW_POSITION_IN_TOTAL_IMAGE_PIXEL_MATRIX); |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
200 |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
201 int xx, yy; |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
202 if (!reader.GetIntegerValue(xx, pathX) || |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
203 !reader.GetIntegerValue(yy, pathY)) |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
204 { |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
205 throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentTag); |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
206 } |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
207 |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
208 // "-1", because coordinates are shifted by 1 in DICOM |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
209 xx -= 1; |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
210 yy -= 1; |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
211 |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
212 unsigned int x = static_cast<unsigned int>(xx); |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
213 unsigned int y = static_cast<unsigned int>(yy); |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
214 |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
215 if (xx < 0 || |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
216 yy < 0 || |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
217 x % tileWidth_ != 0 || |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
218 y % tileHeight_ != 0 || |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
219 x >= totalWidth_ || |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
220 y >= totalHeight_) |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
221 { |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
222 LOG(ERROR) << "Frame " << i << " with unexpected tile location (" |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
223 << x << "," << y << ") in instance: " << instanceId; |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
224 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
225 } |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
226 |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
227 frames_[i].first = x / tileWidth_; |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
228 frames_[i].second = y / tileHeight_; |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
229 } |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
230 } |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
231 else |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
232 { |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
233 // No "Per frame functional groups sequence" tag. Assume regular grid. |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
234 frames_.resize(tmp); |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
235 |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
236 // Compute "ceiling(totalWidth_ / tileWidth_) |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
237 unsigned int w = totalWidth_ / tileWidth_; |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
238 if (totalWidth_ % tileWidth_ != 0) |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
239 { |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
240 w += 1; |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
241 } |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
242 |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
243 unsigned int h = totalHeight_ / tileHeight_; |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
244 if (totalHeight_ % tileHeight_ != 0) |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
245 { |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
246 h += 1; |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
247 } |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
248 |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
249 if (w * h != tmp) |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
250 { |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
251 LOG(ERROR) << "Mismatch between the number of frames in instance: " << instanceId; |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
252 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
253 } |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
254 |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
255 for (size_t i = 0; i < frames_.size(); i++) |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
256 { |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
257 frames_[i].first = i % w; |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
258 frames_[i].second = i / w; |
02cb86d07966
Allow images without "Per frame functional groups sequence" tag (0x5200,0x9230)
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
214
diff
changeset
|
259 } |
0 | 260 } |
261 } | |
262 | |
263 | |
196
b0bd22077cd8
sharing code with orthanc-stone
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
194
diff
changeset
|
264 DicomPyramidInstance::DicomPyramidInstance(OrthancStone::IOrthancConnection& orthanc, |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
265 const std::string& instanceId, |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
266 bool useCache) : |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
267 instanceId_(instanceId), |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
268 hasCompression_(false), |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
269 compression_(ImageCompression_None) // Dummy initialization for serialization |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
270 { |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
271 if (useCache) |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
272 { |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
273 try |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
274 { |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
275 // Try and deserialized the cached information about this instance |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
276 std::string serialized; |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
277 orthanc.RestApiGet(serialized, "/instances/" + instanceId + "/metadata/" + SERIALIZED_METADATA); |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
278 Deserialize(serialized); |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
279 return; // Success |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
280 } |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
281 catch (Orthanc::OrthancException&) |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
282 { |
70 | 283 // No cached information yet |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
284 } |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
285 } |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
286 |
70 | 287 // Compute information about this instance from scratch |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
288 Load(orthanc, instanceId); |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
289 |
70 | 290 if (useCache) |
291 { | |
292 // Serialize the computed information and cache it as a metadata | |
293 std::string serialized, tmp; | |
294 Serialize(serialized); | |
295 orthanc.RestApiPut(tmp, "/instances/" + instanceId + "/metadata/" + SERIALIZED_METADATA, serialized); | |
296 } | |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
297 } |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
298 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
299 |
0 | 300 unsigned int DicomPyramidInstance::GetFrameLocationX(size_t frame) const |
301 { | |
302 assert(frame < frames_.size()); | |
303 return frames_[frame].first; | |
304 } | |
305 | |
306 | |
307 unsigned int DicomPyramidInstance::GetFrameLocationY(size_t frame) const | |
308 { | |
309 assert(frame < frames_.size()); | |
310 return frames_[frame].second; | |
311 } | |
64
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
312 |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
313 |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
314 |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
315 static const char* const HAS_COMPRESSION = "HasCompression"; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
316 static const char* const IMAGE_COMPRESSION = "ImageCompression"; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
317 static const char* const PIXEL_FORMAT = "PixelFormat"; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
318 static const char* const FRAMES = "Frames"; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
319 static const char* const TILE_WIDTH = "TileWidth"; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
320 static const char* const TILE_HEIGHT = "TileHeight"; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
321 static const char* const TOTAL_WIDTH = "TotalWidth"; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
322 static const char* const TOTAL_HEIGHT = "TotalHeight"; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
323 static const char* const PHOTOMETRIC_INTERPRETATION = "PhotometricInterpretation"; |
219
ef3f8c5126a4
Don't display the thumbnail/overview instances in the Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
217
diff
changeset
|
324 static const char* const IMAGE_TYPE = "ImageType"; |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
325 |
64
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
326 |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
327 void DicomPyramidInstance::Serialize(std::string& result) const |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
328 { |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
329 Json::Value frames = Json::arrayValue; |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
330 for (size_t i = 0; i < frames_.size(); i++) |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
331 { |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
332 Json::Value frame = Json::arrayValue; |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
333 frame.append(frames_[i].first); |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
334 frame.append(frames_[i].second); |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
335 frames.append(frame); |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
336 } |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
337 |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
338 Json::Value content = Json::objectValue; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
339 content[FRAMES] = frames; |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
340 |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
341 // "instanceId_" is set by the constructor |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
342 |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
343 content[HAS_COMPRESSION] = hasCompression_; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
344 content[IMAGE_COMPRESSION] = static_cast<int>(compression_); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
345 content[PIXEL_FORMAT] = static_cast<int>(format_); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
346 content[TILE_WIDTH] = tileWidth_; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
347 content[TILE_HEIGHT] = tileHeight_; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
348 content[TOTAL_WIDTH] = totalWidth_; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
349 content[TOTAL_HEIGHT] = totalHeight_; |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
350 content[PHOTOMETRIC_INTERPRETATION] = Orthanc::EnumerationToString(photometric_); |
219
ef3f8c5126a4
Don't display the thumbnail/overview instances in the Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
217
diff
changeset
|
351 content[IMAGE_TYPE] = imageType_; |
64
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
352 |
223
443f219a68fd
sync, compatibility with Orthanc framework 1.8.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
219
diff
changeset
|
353 OrthancPlugins::WriteFastJson(result, content); |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
354 } |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
355 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
356 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
357 void DicomPyramidInstance::Deserialize(const std::string& s) |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
358 { |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
359 Json::Value content; |
223
443f219a68fd
sync, compatibility with Orthanc framework 1.8.2
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
219
diff
changeset
|
360 OrthancPlugins::ReadJson(content, s); |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
361 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
362 if (content.type() != Json::objectValue || |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
363 !content.isMember(FRAMES) || |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
364 content[FRAMES].type() != Json::arrayValue) |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
365 { |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
366 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
367 } |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
368 |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
369 hasCompression_ = Orthanc::SerializationToolbox::ReadBoolean(content, HAS_COMPRESSION); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
370 compression_ = static_cast<ImageCompression>(Orthanc::SerializationToolbox::ReadInteger(content, IMAGE_COMPRESSION)); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
371 format_ = static_cast<Orthanc::PixelFormat>(Orthanc::SerializationToolbox::ReadInteger(content, PIXEL_FORMAT)); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
372 tileWidth_ = Orthanc::SerializationToolbox::ReadUnsignedInteger(content, TILE_WIDTH); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
373 tileHeight_ = Orthanc::SerializationToolbox::ReadUnsignedInteger(content, TILE_HEIGHT); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
374 totalWidth_ = Orthanc::SerializationToolbox::ReadUnsignedInteger(content, TOTAL_WIDTH); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
375 totalHeight_ = Orthanc::SerializationToolbox::ReadUnsignedInteger(content, TOTAL_HEIGHT); |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
376 |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
377 std::string p = Orthanc::SerializationToolbox::ReadString(content, PHOTOMETRIC_INTERPRETATION); |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
378 photometric_ = Orthanc::StringToPhotometricInterpretation(p.c_str()); |
219
ef3f8c5126a4
Don't display the thumbnail/overview instances in the Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
217
diff
changeset
|
379 |
ef3f8c5126a4
Don't display the thumbnail/overview instances in the Web viewer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
217
diff
changeset
|
380 imageType_ = Orthanc::SerializationToolbox::ReadString(content, IMAGE_TYPE); |
217
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
381 |
20bc074ec19a
Viewer can display DICOM pyramids whose tile sizes vary across levels
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
216
diff
changeset
|
382 const Json::Value f = content[FRAMES]; |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
383 frames_.resize(f.size()); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
384 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
385 for (Json::Value::ArrayIndex i = 0; i < f.size(); i++) |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
386 { |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
387 if (f[i].type() != Json::arrayValue || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
388 f[i].size() != 2 || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
389 f[i][0].type() != Json::intValue || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
390 f[i][1].type() != Json::intValue || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
391 f[i][0].asInt() < 0 || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
392 f[i][1].asInt() < 0) |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
393 { |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
394 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
395 } |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
396 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
397 frames_[i].first = f[i][0].asInt(); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
398 frames_[i].second = f[i][1].asInt(); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
399 } |
64
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
400 } |
0 | 401 } |