Mercurial > hg > orthanc-wsi
comparison Framework/Inputs/DicomPyramidInstance.cpp @ 68:c619c8bd72ed
DicomPyramidInstance::Deserialize
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 25 Nov 2016 21:18:46 +0100 |
parents | 63d0a5c74460 |
children | d529d9ce3c7e |
comparison
equal
deleted
inserted
replaced
67:789885bd06ae | 68:c619c8bd72ed |
---|---|
122 | 122 |
123 return compression_; | 123 return compression_; |
124 } | 124 } |
125 | 125 |
126 | 126 |
127 DicomPyramidInstance::DicomPyramidInstance(OrthancPlugins::IOrthancConnection& orthanc, | 127 void DicomPyramidInstance::Load(OrthancPlugins::IOrthancConnection& orthanc, |
128 const std::string& instanceId) : | 128 const std::string& instanceId) |
129 instanceId_(instanceId), | |
130 hasCompression_(false) | |
131 { | 129 { |
132 using namespace OrthancPlugins; | 130 using namespace OrthancPlugins; |
133 | 131 |
134 DicomDatasetReader reader(new FullOrthancDataset(orthanc, "/instances/" + instanceId + "/tags")); | 132 DicomDatasetReader reader(new FullOrthancDataset(orthanc, "/instances/" + instanceId + "/tags")); |
135 | 133 |
192 frames_[i].second = y / tileHeight_; | 190 frames_[i].second = y / tileHeight_; |
193 } | 191 } |
194 } | 192 } |
195 | 193 |
196 | 194 |
195 DicomPyramidInstance::DicomPyramidInstance(OrthancPlugins::IOrthancConnection& orthanc, | |
196 const std::string& instanceId) : | |
197 instanceId_(instanceId), | |
198 hasCompression_(false) | |
199 { | |
200 Load(orthanc, instanceId); | |
201 } | |
202 | |
203 | |
197 unsigned int DicomPyramidInstance::GetFrameLocationX(size_t frame) const | 204 unsigned int DicomPyramidInstance::GetFrameLocationX(size_t frame) const |
198 { | 205 { |
199 assert(frame < frames_.size()); | 206 assert(frame < frames_.size()); |
200 return frames_[frame].first; | 207 return frames_[frame].first; |
201 } | 208 } |
218 frame.append(frames_[i].second); | 225 frame.append(frames_[i].second); |
219 | 226 |
220 frames.append(frame); | 227 frames.append(frame); |
221 } | 228 } |
222 | 229 |
223 Json::Value value; | 230 Json::Value content; |
224 value["PixelFormat"] = Orthanc::EnumerationToString(format_); | 231 content["Frames"] = frames; |
225 value["TileHeight"] = tileHeight_; | 232 content["TileHeight"] = tileHeight_; |
226 value["TileWidth"] = tileWidth_; | 233 content["TileWidth"] = tileWidth_; |
227 value["TotalHeight"] = totalHeight_; | 234 content["TotalHeight"] = totalHeight_; |
228 value["TotalWidth"] = totalWidth_; | 235 content["TotalWidth"] = totalWidth_; |
229 value["Frames"] = frames; | 236 |
237 switch (format_) | |
238 { | |
239 case Orthanc::PixelFormat_RGB24: | |
240 content["PixelFormat"] = 0; | |
241 break; | |
242 | |
243 case Orthanc::PixelFormat_Grayscale8: | |
244 content["PixelFormat"] = 1; | |
245 break; | |
246 | |
247 default: | |
248 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
249 } | |
230 | 250 |
231 Json::FastWriter writer; | 251 Json::FastWriter writer; |
232 result = writer.write(value); | 252 result = writer.write(content); |
253 } | |
254 | |
255 | |
256 void DicomPyramidInstance::Deserialize(const std::string& s) | |
257 { | |
258 hasCompression_ = false; | |
259 | |
260 Json::Value content; | |
261 OrthancPlugins::IOrthancConnection::ParseJson(content, s); | |
262 | |
263 if (content.type() != Json::objectValue || | |
264 !content.isMember("Frames") || | |
265 !content.isMember("PixelFormat") || | |
266 !content.isMember("TileHeight") || | |
267 !content.isMember("TileWidth") || | |
268 !content.isMember("TotalHeight") || | |
269 !content.isMember("TotalWidth") || | |
270 content["Frames"].type() != Json::arrayValue || | |
271 content["PixelFormat"].type() != Json::intValue || | |
272 content["TileHeight"].type() != Json::intValue || | |
273 content["TileWidth"].type() != Json::intValue || | |
274 content["TotalHeight"].type() != Json::intValue || | |
275 content["TotalWidth"].type() != Json::intValue || | |
276 content["TileHeight"].asInt() < 0 || | |
277 content["TileWidth"].asInt() < 0 || | |
278 content["TotalHeight"].asInt() < 0 || | |
279 content["TotalWidth"].asInt() < 0) | |
280 { | |
281 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
282 } | |
283 | |
284 switch (content["Frames"].asInt()) | |
285 { | |
286 case 0: | |
287 format_ = Orthanc::PixelFormat_RGB24; | |
288 break; | |
289 | |
290 case 1: | |
291 format_ = Orthanc::PixelFormat_Grayscale8; | |
292 break; | |
293 | |
294 default: | |
295 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
296 } | |
297 | |
298 tileHeight_ = static_cast<unsigned int>(content["TileHeight"].asInt()); | |
299 tileWidth_ = static_cast<unsigned int>(content["TileWidth"].asInt()); | |
300 totalHeight_ = static_cast<unsigned int>(content["TotalHeight"].asInt()); | |
301 totalWidth_ = static_cast<unsigned int>(content["TotalWidth"].asInt()); | |
302 | |
303 const Json::Value f = content["Frames"]; | |
304 frames_.resize(f.size()); | |
305 | |
306 for (Json::Value::ArrayIndex i = 0; i < f.size(); i++) | |
307 { | |
308 if (f[i].type() != Json::arrayValue || | |
309 f[i].size() != 2 || | |
310 f[i][0].type() != Json::intValue || | |
311 f[i][1].type() != Json::intValue || | |
312 f[i][0].asInt() < 0 || | |
313 f[i][1].asInt() < 0) | |
314 { | |
315 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
316 } | |
317 | |
318 frames_[i].first = f[i][0].asInt(); | |
319 frames_[i].second = f[i][1].asInt(); | |
320 } | |
233 } | 321 } |
234 } | 322 } |