Mercurial > hg > orthanc-wsi
annotate Framework/Inputs/DicomPyramidInstance.cpp @ 194:e57e6ca5303d
sync
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 30 Jun 2020 18:03:23 +0200 |
parents | f299c191cd76 |
children | b0bd22077cd8 |
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 | |
175
e3cbf890b588
upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
166
diff
changeset
|
5 * Copyright (C) 2017-2020 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" |
26 #include "Orthanc/DicomDatasetReader.h" | |
27 #include "Orthanc/FullOrthancDataset.h" | |
28 | |
192 | 29 #include <Logging.h> |
30 #include <OrthancException.h> | |
31 #include <Toolbox.h> | |
32 | |
0 | 33 #include <cassert> |
64
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
34 #include <json/writer.h> |
0 | 35 |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
36 #define SERIALIZED_METADATA "4200" |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
37 |
0 | 38 namespace OrthancWSI |
39 { | |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
40 static ImageCompression DetectImageCompression(OrthancPlugins::IOrthancConnection& orthanc, |
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
41 const std::string& instanceId) |
0 | 42 { |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
43 using namespace OrthancPlugins; |
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
44 |
87 | 45 FullOrthancDataset dataset(orthanc, "/instances/" + instanceId + "/header"); |
46 DicomDatasetReader header(dataset); | |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
47 |
0 | 48 std::string s = Orthanc::Toolbox::StripSpaces |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
49 (header.GetMandatoryStringValue(DICOM_TAG_TRANSFER_SYNTAX_UID)); |
0 | 50 |
51 if (s == "1.2.840.10008.1.2" || | |
52 s == "1.2.840.10008.1.2.1") | |
53 { | |
54 return ImageCompression_None; | |
55 } | |
56 else if (s == "1.2.840.10008.1.2.4.50") | |
57 { | |
58 return ImageCompression_Jpeg; | |
59 } | |
60 else if (s == "1.2.840.10008.1.2.4.90" || | |
61 s == "1.2.840.10008.1.2.4.91") | |
62 { | |
63 return ImageCompression_Jpeg2000; | |
64 } | |
65 else | |
66 { | |
67 LOG(ERROR) << "Unsupported transfer syntax: " << s; | |
68 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
69 } | |
70 } | |
71 | |
72 | |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
73 static void DetectPixelFormat(Orthanc::PixelFormat& format, |
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
74 Orthanc::PhotometricInterpretation& photometric, |
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
75 OrthancPlugins::DicomDatasetReader& reader) |
0 | 76 { |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
77 using namespace OrthancPlugins; |
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
78 |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
79 std::string p = Orthanc::Toolbox::StripSpaces |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
80 (reader.GetMandatoryStringValue(DICOM_TAG_PHOTOMETRIC_INTERPRETATION)); |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
81 |
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
82 photometric = Orthanc::StringToPhotometricInterpretation(p.c_str()); |
0 | 83 |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
84 if (photometric == Orthanc::PhotometricInterpretation_Palette) |
0 | 85 { |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
86 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, |
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
87 "Unsupported photometric interpretation: " + p); |
0 | 88 } |
89 | |
89 | 90 unsigned int bitsStored, samplesPerPixel, tmp; |
91 | |
92 if (!reader.GetUnsignedIntegerValue(bitsStored, DICOM_TAG_BITS_STORED) || | |
93 !reader.GetUnsignedIntegerValue(samplesPerPixel, DICOM_TAG_SAMPLES_PER_PIXEL) || | |
94 !reader.GetUnsignedIntegerValue(tmp, DICOM_TAG_PIXEL_REPRESENTATION)) | |
95 { | |
96 throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentTag); | |
97 } | |
98 | |
99 bool isSigned = (tmp != 0); | |
0 | 100 |
101 if (bitsStored == 8 && | |
102 samplesPerPixel == 1 && | |
103 !isSigned) | |
104 { | |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
105 format = Orthanc::PixelFormat_Grayscale8; |
0 | 106 } |
107 else if (bitsStored == 8 && | |
108 samplesPerPixel == 3 && | |
109 !isSigned) | |
110 { | |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
111 format = Orthanc::PixelFormat_RGB24; |
0 | 112 } |
113 else | |
114 { | |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
115 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, "Unsupported pixel format"); |
0 | 116 } |
117 } | |
118 | |
56
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
119 |
61
147bd6dc28db
refactoring using new items in the plugin toolbox of Orthanc
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
59
diff
changeset
|
120 ImageCompression DicomPyramidInstance::GetImageCompression(OrthancPlugins::IOrthancConnection& orthanc) |
56
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
121 { |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
122 /** |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
123 * 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
|
124 * 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
|
125 * 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
|
126 * 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
|
127 * 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
|
128 * "/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
|
129 **/ |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
130 |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
131 if (!hasCompression_) |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
132 { |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
133 compression_ = DetectImageCompression(orthanc, instanceId_); |
56
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
134 hasCompression_ = true; |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
135 } |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
136 |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
137 return compression_; |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
138 } |
83cd735c885d
speedup the loading of DICOM sources
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
139 |
0 | 140 |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
141 void DicomPyramidInstance::Load(OrthancPlugins::IOrthancConnection& orthanc, |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
142 const std::string& instanceId) |
0 | 143 { |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
144 using namespace OrthancPlugins; |
0 | 145 |
87 | 146 FullOrthancDataset dataset(orthanc, "/instances/" + instanceId + "/tags"); |
147 DicomDatasetReader reader(dataset); | |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
148 |
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
149 if (reader.GetMandatoryStringValue(DICOM_TAG_SOP_CLASS_UID) != "1.2.840.10008.5.1.4.1.1.77.1.6" || |
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
150 reader.GetMandatoryStringValue(DICOM_TAG_MODALITY) != "SM") |
0 | 151 { |
152 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
153 } | |
154 | |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
155 hasCompression_ = false; |
166
f0dac1e8f736
access to photometric interpretation of source pyramids
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
157
diff
changeset
|
156 DetectPixelFormat(format_, photometric_, reader); |
89 | 157 |
158 unsigned int tmp; | |
159 if (!reader.GetUnsignedIntegerValue(tileWidth_, DICOM_TAG_COLUMNS) || | |
160 !reader.GetUnsignedIntegerValue(tileHeight_, DICOM_TAG_ROWS) || | |
161 !reader.GetUnsignedIntegerValue(totalWidth_, DICOM_TAG_TOTAL_PIXEL_MATRIX_COLUMNS) || | |
162 !reader.GetUnsignedIntegerValue(totalHeight_, DICOM_TAG_TOTAL_PIXEL_MATRIX_ROWS) || | |
163 !reader.GetUnsignedIntegerValue(tmp, DICOM_TAG_NUMBER_OF_FRAMES)) | |
164 { | |
165 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
166 } | |
0 | 167 |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
168 size_t countFrames; |
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
169 if (!reader.GetDataset().GetSequenceSize(countFrames, DICOM_TAG_PER_FRAME_FUNCTIONAL_GROUPS_SEQUENCE)) |
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
170 { |
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
171 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
172 } |
0 | 173 |
89 | 174 if (countFrames != tmp) |
0 | 175 { |
176 LOG(ERROR) << "Mismatch between the number of frames in instance: " << instanceId; | |
177 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
178 } | |
179 | |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
180 frames_.resize(countFrames); |
0 | 181 |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
182 for (size_t i = 0; i < countFrames; i++) |
0 | 183 { |
89 | 184 DicomPath pathX(DICOM_TAG_PER_FRAME_FUNCTIONAL_GROUPS_SEQUENCE, i, |
185 DICOM_TAG_PLANE_POSITION_SLIDE_SEQUENCE, 0, | |
186 DICOM_TAG_COLUMN_POSITION_IN_TOTAL_IMAGE_PIXEL_MATRIX); | |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
187 |
89 | 188 DicomPath pathY(DICOM_TAG_PER_FRAME_FUNCTIONAL_GROUPS_SEQUENCE, i, |
189 DICOM_TAG_PLANE_POSITION_SLIDE_SEQUENCE, 0, | |
190 DICOM_TAG_ROW_POSITION_IN_TOTAL_IMAGE_PIXEL_MATRIX); | |
191 | |
192 int xx, yy; | |
193 if (!reader.GetIntegerValue(xx, pathX) || | |
194 !reader.GetIntegerValue(yy, pathY)) | |
195 { | |
196 throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentTag); | |
197 } | |
0 | 198 |
199 // "-1", because coordinates are shifted by 1 in DICOM | |
62
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
200 xx -= 1; |
f45cec2c32e2
Speed-up in the Web viewer plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
61
diff
changeset
|
201 yy -= 1; |
0 | 202 |
203 unsigned int x = static_cast<unsigned int>(xx); | |
204 unsigned int y = static_cast<unsigned int>(yy); | |
205 | |
206 if (xx < 0 || | |
207 yy < 0 || | |
208 x % tileWidth_ != 0 || | |
209 y % tileHeight_ != 0 || | |
210 x >= totalWidth_ || | |
211 y >= totalHeight_) | |
212 { | |
213 LOG(ERROR) << "Frame " << i << " with unexpected tile location (" | |
214 << x << "," << y << ") in instance: " << instanceId; | |
215 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
216 } | |
217 | |
218 frames_[i].first = x / tileWidth_; | |
219 frames_[i].second = y / tileHeight_; | |
220 } | |
221 } | |
222 | |
223 | |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
224 DicomPyramidInstance::DicomPyramidInstance(OrthancPlugins::IOrthancConnection& orthanc, |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
225 const std::string& instanceId, |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
226 bool useCache) : |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
227 instanceId_(instanceId), |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
228 hasCompression_(false) |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
229 { |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
230 if (useCache) |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
231 { |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
232 try |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
233 { |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
234 // Try and deserialized the cached information about this instance |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
235 std::string serialized; |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
236 orthanc.RestApiGet(serialized, "/instances/" + instanceId + "/metadata/" + SERIALIZED_METADATA); |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
237 Deserialize(serialized); |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
238 return; // Success |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
239 } |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
240 catch (Orthanc::OrthancException&) |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
241 { |
70 | 242 // No cached information yet |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
243 } |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
244 } |
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
245 |
70 | 246 // Compute information about this instance from scratch |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
247 Load(orthanc, instanceId); |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
248 |
70 | 249 if (useCache) |
250 { | |
251 // Serialize the computed information and cache it as a metadata | |
252 std::string serialized, tmp; | |
253 Serialize(serialized); | |
254 orthanc.RestApiPut(tmp, "/instances/" + instanceId + "/metadata/" + SERIALIZED_METADATA, serialized); | |
255 } | |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
256 } |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
257 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
258 |
0 | 259 unsigned int DicomPyramidInstance::GetFrameLocationX(size_t frame) const |
260 { | |
261 assert(frame < frames_.size()); | |
262 return frames_[frame].first; | |
263 } | |
264 | |
265 | |
266 unsigned int DicomPyramidInstance::GetFrameLocationY(size_t frame) const | |
267 { | |
268 assert(frame < frames_.size()); | |
269 return frames_[frame].second; | |
270 } | |
64
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
271 |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
272 |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
273 void DicomPyramidInstance::Serialize(std::string& result) const |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
274 { |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
275 Json::Value frames = Json::arrayValue; |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
276 for (size_t i = 0; i < frames_.size(); i++) |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
277 { |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
278 Json::Value frame = Json::arrayValue; |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
279 frame.append(frames_[i].first); |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
280 frame.append(frames_[i].second); |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
281 |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
282 frames.append(frame); |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
283 } |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
284 |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
285 Json::Value content; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
286 content["Frames"] = frames; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
287 content["TileHeight"] = tileHeight_; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
288 content["TileWidth"] = tileWidth_; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
289 content["TotalHeight"] = totalHeight_; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
290 content["TotalWidth"] = totalWidth_; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
291 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
292 switch (format_) |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
293 { |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
294 case Orthanc::PixelFormat_RGB24: |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
295 content["PixelFormat"] = 0; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
296 break; |
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 case Orthanc::PixelFormat_Grayscale8: |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
299 content["PixelFormat"] = 1; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
300 break; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
301 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
302 default: |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
303 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
304 } |
64
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
305 |
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
306 Json::FastWriter writer; |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
307 result = writer.write(content); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
308 } |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
309 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
310 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
311 void DicomPyramidInstance::Deserialize(const std::string& s) |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
312 { |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
313 hasCompression_ = false; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
314 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
315 Json::Value content; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
316 OrthancPlugins::IOrthancConnection::ParseJson(content, s); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
317 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
318 if (content.type() != Json::objectValue || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
319 !content.isMember("Frames") || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
320 !content.isMember("PixelFormat") || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
321 !content.isMember("TileHeight") || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
322 !content.isMember("TileWidth") || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
323 !content.isMember("TotalHeight") || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
324 !content.isMember("TotalWidth") || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
325 content["Frames"].type() != Json::arrayValue || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
326 content["PixelFormat"].type() != Json::intValue || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
327 content["TileHeight"].type() != Json::intValue || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
328 content["TileWidth"].type() != Json::intValue || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
329 content["TotalHeight"].type() != Json::intValue || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
330 content["TotalWidth"].type() != Json::intValue || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
331 content["TileHeight"].asInt() < 0 || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
332 content["TileWidth"].asInt() < 0 || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
333 content["TotalHeight"].asInt() < 0 || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
334 content["TotalWidth"].asInt() < 0) |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
335 { |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
336 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
337 } |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
338 |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
339 switch (content["PixelFormat"].asInt()) |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
340 { |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
341 case 0: |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
342 format_ = Orthanc::PixelFormat_RGB24; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
343 break; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
344 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
345 case 1: |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
346 format_ = Orthanc::PixelFormat_Grayscale8; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
347 break; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
348 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
349 default: |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
350 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
351 } |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
352 |
69
d529d9ce3c7e
cache for DicomPyramidInstance
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
68
diff
changeset
|
353 hasCompression_ = false; |
68
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
354 tileHeight_ = static_cast<unsigned int>(content["TileHeight"].asInt()); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
355 tileWidth_ = static_cast<unsigned int>(content["TileWidth"].asInt()); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
356 totalHeight_ = static_cast<unsigned int>(content["TotalHeight"].asInt()); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
357 totalWidth_ = static_cast<unsigned int>(content["TotalWidth"].asInt()); |
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 const Json::Value f = content["Frames"]; |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
360 frames_.resize(f.size()); |
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 for (Json::Value::ArrayIndex i = 0; i < f.size(); i++) |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
363 { |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
364 if (f[i].type() != Json::arrayValue || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
365 f[i].size() != 2 || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
366 f[i][0].type() != Json::intValue || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
367 f[i][1].type() != Json::intValue || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
368 f[i][0].asInt() < 0 || |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
369 f[i][1].asInt() < 0) |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
370 { |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
371 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
372 } |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
373 |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
374 frames_[i].first = f[i][0].asInt(); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
375 frames_[i].second = f[i][1].asInt(); |
c619c8bd72ed
DicomPyramidInstance::Deserialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
64
diff
changeset
|
376 } |
64
63d0a5c74460
DicomPyramidInstance::Serialize
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
377 } |
0 | 378 } |